设计模式12-策略模式
来源:互联网 发布:冬未了 知乎 编辑:程序博客网 时间:2024/06/05 06:26
话说,三国演义中,孙权看出刘备有野心,杀不能杀,留着又是祸害,于是想出一个办法,准备招刘备做女婿。让后留着刘备在东吴,软禁刘备。东吴的想法很好,无奈有一个诸葛亮,他预测了东吴有此招数,于是在刘备去东吴招亲之前,特授给伴郎赵云三个锦囊,按天机拆开解决棘手问题。
这三个妙计分别是:找乔国老帮忙,求吴国太放行以及孙夫人断后。这三个计谋有一个方法都是执行,具体执行上面内容,每个计谋不同,执行不同,于是这里我们就有一个设计思路:三个妙计应该实现的是同一个接口,看下面的类图:
1,妙计接口代码如下:
package com.jack.strategy;/** * Created by jack on 2017/8/15. * 妙计接口 */public interface IStrategy { //每个锦囊都是一个可执行的算法 void operate();}
每个妙计都是可执行的,有一个operate方法
2,乔国老开后门
package com.jack.strategy;/** * Created by jack on 2017/8/15. * 乔国老开后门 */public class BackDoor implements IStrategy{ @Override public void operate() { System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); }}
3,吴国太开绿灯
package com.jack.strategy;/** * Created by jack on 2017/8/15. * 吴国太开绿灯 */public class GivenGreenLight implements IStrategy{ @Override public void operate() { System.out.println("求吴国太开绿灯,放行!"); }}
4,孙夫人断后
package com.jack.strategy;/** * Created by jack on 2017/8/15. * 孙夫人断后 */public class BlockEnemy implements IStrategy{ @Override public void operate() { System.out.println("孙夫人断后,挡住追兵"); }}
在这个场景中,三个妙计都有了,那还缺两个配角:第一,妙计肯定要放到一个地方,也就是承接妙计的锦囊;第二,这些都要有一个人去执行,就是赵云。赵云是一个干活的人,从锦囊中取出妙计,执行然后获胜。在类图增加一个Context封装(也就是锦囊),其作用是承接三个策略,方便使用,如下:
5,锦囊代码如下:
package com.jack.strategy;/** * Created by jack on 2017/8/15. * 锦囊 */public class Context { /** * 构造函数初始化,要使用哪个妙计 */ private IStrategy iStrategy; public Context(IStrategy iStrategy) { this.iStrategy = iStrategy; } /** * 使用了锦囊,下面开始出招 */ public void operate(){ this.iStrategy.operate(); }}
6,现在赵云可以执行了,代码如下:
package com.jack.strategy;/** * Created by jack on 2017/8/15. */public class ZhaoYun { public static void main(String[] args) { Context context; //刚刚到吴国的时候拆第一个 System.out.println("--刚刚到吴国的时候拆第一个--"); context = new Context(new BackDoor());//拿到妙计 context.operate();//拆开执行 //刘备乐不思蜀,拆开第二个 System.out.println("刘备乐不思蜀,拆开第二个"); context = new Context(new GivenGreenLight()); context.operate();//执行第二个锦囊 //孙权追兵来了,拆开第三个 System.out.println("--孙权追兵来了,拆开第三个--"); context = new Context(new BlockEnemy()); context.operate();//孙夫人退兵 System.out.println("\n\n\n\n"); }}
运行结果如下:
--刚刚到吴国的时候拆第一个--找乔国老帮忙,让吴国太给孙权施加压力刘备乐不思蜀,拆开第二个求吴国太开绿灯,放行!--孙权追兵来了,拆开第三个--孙夫人断后,挡住追兵
策略模式定义:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
策略模式的通用类图如下:
Context封装角色:它也叫上下文角色,起承上启下作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化。
Strategy抽象策略角色:策略,算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
ConcreteStrategy具体策略角色:实现抽象策略中的操作,该类含有具体的算法。
策略模式的优点:
1,算法可以自由切换:这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略。
2,避免使用多重条件判断
3,扩展性良好
缺点:
1,策略类数量增多:每一个策略都是一个类,复用的可能性很小,类数量增多。
2,所有的策略类都是需要对外暴露
使用场景:
1,多个类只有在算法或行为上稍有不同的场景
2,算法需要自由切换的场景
3,需要屏蔽算法规则的场景
代码地址:https://github.com/wj903829182/springboot/tree/master/designpattern
- 设计模式12:策略模式
- 设计模式-12-策略模式
- 设计模式12-策略模式
- 设计模式-策略模式
- 设计模式:策略模式
- 设计模式-策略模式
- 设计模式 - 策略模式
- 设计模式-策略模式
- 设计模式-----策略模式
- 设计模式 策略模式
- 设计模式-策略模式
- 设计模式-【策略模式】
- 设计模式-----策略模式
- 设计模式-策略模式
- 设计模式--策略模式
- 设计模式- 策略模式
- 设计模式- 策略模式
- 设计模式------策略模式
- 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
- 301、404、200、304、500HTTP状态
- php 基于socket的基本通信
- 在Linux中编译jrtplib
- 给Ubuntu 16.04更换更新源
- 设计模式12-策略模式
- java读取properties文件
- MyBatis框架介绍
- Linux系统下安装rz/sz命令及使用说明
- 关于DB2中时间日期的操作
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- Selenium2+Python2.0自动化测试【2】 操作浏览器
- Push对app运营的影响(一)
- 程序提交RE错误问题