java设计模式-策略模式
来源:互联网 发布:电视直播软件看不了 编辑:程序博客网 时间:2024/05/21 05:18
要点:
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。(ContentStrategy)
(2) 抽象策略对象:它可由接口或抽象类来实现。(EncryptStrategy)
(3) 具体策略对象:它封装了实现不功能的不同算法。(MD5EncryptStrategy、RASEncryptStrategy)
接口:
/** * Description:加密解密接口 * User: lc * Date: 2017/9/29 0029 * Time: 下午 4:34 */public interface EncryptStrategy { /** * 加密 * * @return */ String encrypt(String str); /** * 解密 * * @return 成功:true;失败:false */ Boolean decode(String str);}
MD5算法:
/** * Description:MDS加密解密算法 * User: lc * Date: 2017/9/29 0029 * Time: 下午 4:37 */public class MD5EncryptStrategy implements EncryptStrategy { @Override public String encrypt(String str) { return "MD5"; } @Override public Boolean decode(String str) { return str == null || str.length() == 0 ? Boolean.FALSE : Boolean.TRUE; }}
RAS算法:
/** * Description:RAS加密解密算法 * User: lc * Date: 2017/9/29 0029 * Time: 下午 4:40 */public class RASEncryptStrategy implements EncryptStrategy { @Override public String encrypt(String str) { return "RAS"; } @Override public Boolean decode(String str) { return str == null || str.length() == 0 ? Boolean.FALSE : Boolean.TRUE; }}
上下文或者环境:
/** * Description:策略上下文 * User: lc * Date: 2017/9/29 0029 * Time: 下午 4:42 */public class ContentStrategy { private EncryptStrategy encryptStrategy; public void setEncryptStrategy(EncryptStrategy encryptStrategy) { this.encryptStrategy = encryptStrategy; } /** * 加密 * * @return */ public String encrypt(String str) { return encryptStrategy.encrypt(str); } /** * 解密 * * @return 成功:true;失败:false */ public Boolean decode(String str) { return encryptStrategy.decode(str); } ;}
测试代码:
/** * Description: * User: lc * Date: 2017/9/29 0029 * Time: 下午 4:44 */public class Test { public static void main(String[] args) { ContentStrategy cs = new ContentStrategy(); String str = "RAS"; if ("MD5".equals(str)) { cs.setEncryptStrategy(new MD5EncryptStrategy()); } else { cs.setEncryptStrategy(new RASEncryptStrategy()); } System.out.println("密码的策略:" +cs.encrypt("0000"));; }}
测试结果:
密码的策略:RAS
Process finished with exit code 0
优点:
新增算法,只需要实现相应的接口,不改变原有的组件,比如(ContentStrategy、EncryptStrategy)
缺点:
需要随着算法的增多,增加了客户端调用的复杂度,以及客户端需要明确知道有哪几种算法。
策略模式与工厂模式的比较
工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。
策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化
例子
策略模式的做法:有几种方案供你选择旅行,选择火车好呢还是骑自行车,完全有客户自行决定去构建旅行方案(比如你自己需要去买火车票,或者机票)。
工厂模式的做法:你决定哪种旅行方案后,不用关注这旅行方案怎么给你创建,也就是说你告诉我方案的名称就可以了,然后由工厂代替你去构建具体方案(工厂代替你去买火车票)。
上面的例子里面client代码:
cs.setEncryptStrategy(new MD5EncryptStrategy());
我们看到客户需要自己去创建具体算法(new MD5EncryptStrategy())实例。传递的是具体实例。
而工厂模式你只要告诉哪种旅行就可以了,不是传递一个具体实例,而是一个标识(旅行方案标识)。
- Java设计模式 -- 策略模式
- java设计模式-----策略模式
- java 设计模式-策略模式
- java设计模式--策略模式
- java设计模式-策略模式
- java设计模式-策略模式
- java设计模式--策略模式
- java设计模式---策略模式
- java设计模式---策略模式
- java设计模式---策略模式
- 【Java设计模式】策略模式
- java设计模式--策略模式
- Java设计模式----策略模式
- Java设计模式------------策略模式
- Java设计模式 - 策略模式
- java设计模式---策略模式
- java设计模式-策略模式
- java设计模式----策略模式
- RGB,YUV 的来历及其相互转换
- Centos7安装Nginx及配置反向代理和负载均衡
- 1029. 旧键盘(20)
- 如何在linux(ubuntu)下安装source insight
- 千年源代码
- java设计模式-策略模式
- 解决在MFC中使用Easylogging++导致TRACE未定义错误
- cocos学习
- 论文解读Focal Loss for Dense Object Detection
- 关于git 分支的使用心得
- 动态规划合并排序问题
- 机器学习基本介绍
- HTML中如何让控件居中
- BZOJ 1818 [Cqoi2010]内部白点