策略模式中一个类的行为可以在运行的时候进行更改,我们需要定义一个策略的接口,让所有的具体策略实现这个接口,然后封装一个可以执行策略的对象,可以通过传入不同的策略,执行不同的算法;
- 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
- 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
- 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
- 如何解决:将这些算法封装成一个一个的类,任意地替换。
- 关键代码:实现同一个接口。
这里举例借鉴了《您的设计模式》中诸葛亮给赵云的锦囊妙计,让赵云去东吴的过程中拆开;
下面看一下类图:
实现策略模式的有以下几个步骤:
-
- 定义一个策略接口
- 让能够执行的具体策略实现这个接口
- 封装一个可以执行策略的对象
- 调用对应的策略
1、定义一个策略接口
package com.dongl.strategy; /** * 定义一个的策略 */ public interface Strategy { //每个锦囊妙计都是一个可执行的算法 public void operate(); }
2、具体策略实现策略接口
第一个策略:
package com.dongl.strategy; public class BackDoor implements Strategy{ @Override public void operate() { System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); } }
第二个策略:
package com.dongl.strategy; public class BlockEnemy implements Strategy { @Override public void operate() { System.out.println("孙夫人断后,挡住追兵"); } }
第三个策略:
package com.dongl.strategy; public class GivenGreenLight implements Strategy { @Override public void operate() { System.out.println("求吴国太开个绿灯,放行!"); } }
3、封装一个可以执行策略的
package com.dongl.strategy; /** * 计谋有了,那还要有锦囊 */ public class Context { //构造函数,你要使用那个妙计 private Strategy straegy; public Context(Strategy strategy){ this.straegy = strategy; } //使用计谋了,看我出招了 public void operate(){ this.straegy.operate(); } }
4、调用对应策略
package com.dongl.strategy; 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(); //孙夫人退兵 } }