Java开发之设计模式--策略模式(Strategy Pattern)
来源:互联网 发布:北京地下室 知乎 编辑:程序博客网 时间:2024/04/25 23:17
模拟场景:
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。
类图
Java程序
- 三个妙计是同一类型,那咱就写个接口:
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all. * 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口 * */public interface IStrategy { //每个锦囊妙计都是一个可执行的算法 public void operate();}
- 三个妙计,三个实现类:
1.
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all. * 找乔国老帮忙,使孙权不能杀刘备 */public class BackBoor implements IStrategy { public void operate() { System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); }}
2.
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all. * 求吴国太开个绿灯 */public class GivenGreenLight implements IStrategy { public void operate() { System.out.println("求吴国太开个绿灯,放行!"); }}
3.
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all. * 孙夫人断后,挡住追兵 */public class BlockEnemy implements IStrategy { public void operate() { System.out.println("孙夫人断后,挡住追兵"); }}
- 三个妙计入锦囊:
package com.zanelove.strategy;/*** I'm glad to share my knowledge with you all. * 计谋有了,那还要有锦囊*/public class Context { //构造函数,你要使用哪个妙计 private IStrategy strategy; public Context(IStrategy strategy){ this.strategy = strategy; } //使用计谋了,看我出招了 public void operate(){ this.strategy.operate(); }}
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:
- 赵云出场,一个顶俩:
package com.zanelove.strategy;/** * I'm glad to share my knowledge with you all. */public class ZhaoYun { /** * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计 */ public static void main(String[] args) { Context context; //刚刚到吴国的时候,拆第一个 context = new Context(new BackDoor()); //拿到妙计 context.operate(); //拆开执行 //刘备乐不思蜀了,拆第二个 context = new Context(new GivenGreenLight()); context.operate(); //执行了第二个锦囊了 //孙权的小兵追了,咋办?拆第三个 context = new Context(new BlockEnemy()); context.operate(); //孙夫人退兵 } }
策略模式优点:
算法的使用和算法本身解耦,即把变化的具体算法封装了起来。策略模式是除了继承之外的一种弹性替代方案,如果你使用继承定义了一个类,下面有部分的派生类,此时你会让基类所困住,要想修改它特别不容易,而策略模式则可能通过组合不同的对象来改变行为。
策略模式缺点:
1、 虽说客户代码无须关心各个策略是如何实现的,但是它们还是要知道有多少种策略实现,具体功能情况,这样才可以根据需要使用哪个策略。
2、 使用策略模式后出现很多小类。
就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了, 还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下去,只要修改 Context.java 就可以了,这 个不多说了,自己领会吧。
0 0
- Java开发之设计模式--策略模式(Strategy Pattern)
- 设计模式之策略模式(Strategy Pattern)
- 设计模式之策略模式---Strategy Pattern
- 设计模式之策略模式(Strategy Pattern)
- 设计模式之策略模式 | Strategy Pattern
- 设计模式之策略模式(Strategy Pattern)
- 设计模式之策略模式-Strategy Pattern
- java设计模式---Strategy Pattern---策略模式
- Java设计模式--策略模式【Strategy Pattern】
- 设计模式之三 --- 策略模式(Strategy Pattern) (java)
- JAVA设计模式之 策略模式【Strategy Pattern】
- java模式之策略模式(Strategy Pattern)
- Design Pattern-Strategy Pattern 设计模式之策略模式
- Java设计模式 Design Pattern:策略模式 Strategy Pattern
- Java设计模式 Design Pattern:策略模式 Strategy Pattern
- Java 策略模式 (Strategy Pattern)
- Java Strategy Pattern(策略模式)
- java设计模式之策略模式 Strategy
- CMake手册详解 (十一)
- GRE词根整理--graph
- Objective-C----继承
- Android获得缩略图的代码注释
- android viewdraghelper使用
- Java开发之设计模式--策略模式(Strategy Pattern)
- java笔记18 Map集合
- CMake手册详解 (十二)
- 【Servlet】Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地
- db2创建表
- CMake手册详解 (十三)
- 【codechef】Chef and Bracket-Pairs (分层dp)
- 在eclipse中如何在大量项目中查找指定文件
- 日韓国交50年―正面から向き合う契機に