Java设计模式——策略模式
来源:《您的设计模式》
摘要:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计, 一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 JAVA 程序怎么表现这个呢?
一、类图
二、代码实现
2.1、"锦囊妙计"接口
//策略接口,这是诸葛亮给赵云的三个锦囊妙计的接口
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法
public void operate();
}
2.2、实现妙计的方法
- 方法一:开后门
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("开后门:找人帮忙,阻止孙权杀刘备");
}
}
- 方法二:开绿灯
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("开绿灯:求吴国放行");
}
}
- 方法三:断后
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("断后:阻挡追兵");
}
}
2.3、锦囊
public class Context {
//构造函数,要使用哪个妙计
private IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
//使用计谋
public void operate(){
this.strategy.operate();
}
}
*中途:然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:
2.4、拆开锦囊
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();
/*
*问题来了:赵云实际不知道是那个策略呀,他只知道拆第一个锦囊,
*而不知道是BackDoor这个妙计,咋办? 似乎这个策略模式已经把计谋名称写出来了
*
* 错!BackDoor、GivenGreenLight、BlockEnemy只是一个代码,你写成first、second、
third,没人会说你错!
*
* 策略模式的好处就是:体现了高内聚低耦合的特性呀,缺点嘛,这个那个,我回去再查查
*/
}
}
三、运行结果
后续:就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了,还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下去,只要修改 Context.java 就可以了,这个不多说了,自己领会吧!
四、总结
策略模式的主要角色就是:
- 抽象策略类,定义一个公共接口,也就是本文中的 "锦囊妙计"接口;
- 具体策略类,实现抽象策略定义的接口,提供具体的算法实现,也就是本文中的实现妙计的方法。
- 环境类,一个策略类的引用,最终给客户端调用,也就是本文中的 锦囊。
- 客户端,调用环境类,也就是本文中的拆开锦囊的人。
最后,该文章来源的书籍《您的设计模式》的所有有关设计模式的内容生动且容易理解,强烈推荐学习!!!