开发者社区> 程序员大阳> 正文

Java设计模式——策略模式——方法多样 调度灵活

简介: 本文目录 1. 何为策略 2. 举个栗子 2.1 抽象策略 2.2 具体策略 2.3 调用环境 2.4 调用示例 2.5 借助枚举与工厂模式规范调用
+关注继续查看

1. 何为策略

策略,英文strategy,音标[ˈstrætədʒi],来来来,此处read after me大声读三遍,什么重音、清辅音、浊辅音我都玩的有模有样,十分优秀吭。


策略就是方法,办法,方针,计谋差不多的意思,策略模式就如把三十六计汇聚成一本书,一块研究管理,不然的话如此多的策略,打起仗来临时抱佛脚也不知道该去哪里抱啊。


所以策略模式就是把策略归置好,并且通过一个集中的环境去读取后使用。例如三十六计,就是把三十六中计谋集中归置到书本(集中的环境)中,代后人调阅,也不用管后人到底是古代人,还是现代人,还是中国人,还是外国人,就是这么牛X吭。


2. 举个栗子

光说不练是假把式,手中必须有栗子才是真本事,此处我们举个现实的编程实例。


比如现在我们有很多种数字加密算法,我们应该把这些不同的算法(策略)封装起来,后续不管是网页调用也好,是APP调用也好都可以直接拿过来使用。所以此处就是一个比较标准的策略模式使用场景。


2.1 抽象策略

首先分析下我们的策略是什么样的策略,实际上就是对数字加密,因此封装一个接口IEncryptStrategy,注意这个命令中I表示这是一个接口,Encrypt表示加密,Strategy表示策略,综合起来讲,这是一个加密策略的接口。代码如下:


package org.demo.strategy;

/**

* @theme 加密策略接口

* @author maoge

* @date 2019-12-10

*/

public interface IEncryptStrategy {

/**

 * 对一个数字进行加密

 */

public double encrypt(double input);

}



2.2 具体策略

抽象策略是为了定义一个标准,只有符合标准的才能纳入该类策略,比如此处必须是能对数字加密的策略才行,此处我们实现两个牛X的加密算法,稳!


package org.demo.strategy;


/**

* @theme 加法加密策略

* @author maoge

* @date 2019-12-10

*/

public class AddEncryptStrategy implements IEncryptStrategy {

/**

 * 将原来的值先+1,再加3,再+2,如此复杂的加密算法,一般人想不到哈

 */

@Override

public double encrypt(double input) {

 return input + 1 + 3 + 2;

}

}


package org.demo.strategy;


/**

* @theme 乘法加密策略

* @author maoge

* @date 2019-12-10

*/

public class MultiplyEncryptStrategy implements IEncryptStrategy {

/**

 * 乘法加密——为高端加密算法代言

 */

@Override

public double encrypt(double input) {

 return input * 10;

}

}


2.3 调用环境

策略有了之后,最好放在一个统一的管理环境中,便于灵活调度。就好比要查询计谋可去看《三十六计》书,要调用加密算法就使用加密算法上下文环境。


package org.demo.strategy;


/**

* @theme 加密算法上下文环境

* @author maoge

* @date 2019-12-10

*/

public class EncryptContext {

/**

 * 可保存任意策略

 */

private IEncryptStrategy strategy;


public EncryptContext(IEncryptStrategy strategy) {

 this.strategy = strategy;

}


/**

 * 调用保存的策略

 */

public double encrypt(double input) {

 return strategy.encrypt(input);

}

}


2.4 调用示例

package org.demo.strategy;

/**

* 常规调用实例

*/

public class NormalUseStrategy {

public static void main(String[] args) {

 EncryptContext context = new EncryptContext(new AddEncryptStrategy());

 System.out.println("加法策略:" + context.encrypt(1));

 context = new EncryptContext(new MultiplyEncryptStrategy());

 System.out.println("乘法策略:" + context.encrypt(1));

}

}


2.5 借助枚举与工厂模式规范调用

上面的调用示例对策略生成的管理太随意了,我们可以借助枚举和工厂模式来规范之,代码如下:


加密方法枚举:


package org.demo.strategy;

public enum EncryptStrategyEnum {

ADD, MULTIPLY;

}


工厂模式的环境类:


package org.demo.strategy;


/**

* @theme 加密算法上下文环境

* @author maoge

* @date 2019-12-10

*/

public class EncryptContext {

/**

 * 可保存任意策略

 */

private IEncryptStrategy strategy;


/**

 * 根据枚举生成策略

 */

public EncryptContext(EncryptStrategyEnum encryptStrategyEnum) {

 if (encryptStrategyEnum == EncryptStrategyEnum.ADD) {

  strategy = new AddEncryptStrategy();

 } else {

  strategy = new MultiplyEncryptStrategy();

 }

}


/**

 * 调用保存的策略

 */

public double encrypt(double input) {

 return strategy.encrypt(input);

}

}


调用示例:


package org.demo.strategy;


/**

* 调用实例

*/

public class Demo {

public static void main(String[] args) {

 EncryptContext context = new EncryptContext(EncryptStrategyEnum.ADD);

 System.out.println("加法策略:" + context.encrypt(1));

 context = new EncryptContext(EncryptStrategyEnum.MULTIPLY);

 System.out.println("乘法策略:" + context.encrypt(1));

}

}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
初探Java设计模式3:行为型模式(策略,观察者等)
转自https://javadoop.com/post/design-pattern 行为型模式 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式总结 行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。
915 0
设计模式之五(策略模式)
原文:设计模式之五(策略模式) 前言 策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。 策略模式结构图   Strategy:策略类,定义所有支持的算法的公共接口 ConcreteStrategy1,ConcreteStrategy2,ConcreteStrategy3这三个是具体策略类,封装了具体的算法或行为,继承于Strategy Context上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
743 0
[Head First设计模式]策略模式
原文:[Head First设计模式]策略模式 系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式——建造者模式 [Head First...
821 0
java性能优化策略
· 当进行过多的字符串操作以避免不必要地创建那些最终必须经历垃圾收集的对象时,可使用 StringBuffer 功能而不是字符串并置。
656 0
WPF在在设计模式,使用动态样式
原文:WPF在在设计模式,使用动态样式 1.问题分析 WPF有时候要用到主题样式,比如颜色主题(红色、黄色之类的)通常是key相同,而value不同,比如会这么写: Background="{DynamicResource BackgroundColor}"    主题切换通常在不同的资源文件xaml里面,这时候,如果想在设计时(设计视图)里看看主题,往往得写些临时代码,当编译的时候还得把临时代码删除。
1004 0
设计模式之策略模式
策略模式即设计不同的策略应用于不同的实现上。 代码实现如下: //动物 public abstract class Animal { private Behavior behavior;//让animal和b...
614 0
【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
42 0
大话设计模式之策略模式
        打开百度,搜索“策略”二字,她给你这样的答案:a、可以实现目标的方案集合;b、根据形势发展而制定的行动方针和斗争方法;c、 有斗争艺术,能注意方式方法;d、 计谋,谋略。
793 0
深入理解JAVA虚拟机学习笔记(二)垃圾回收策略
 上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略。        一、finailize()方法                           在介绍GC策略前,先介绍下GC中的finailize方法。
5657 0
设计模式学习——策略模式
一、介绍 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 策略模式应用的例子很多,比如最常见的Java类库中的 Comparator,它将对象的具体比较算法封装起来,我们可以根据所要比较的对象的类型自由选择。策略模式类图如下
15 0
+关注
程序员大阳
努力努力再努力
591
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载