案例:刘备娶亲
刘备到江东娶媳妇儿,临行前诸葛亮给随行的赵云3个锦囊妙计,3个锦囊妙计要在3种场景下使用:
- 到江东之后:找乔国老帮忙,让吴国太给孙权施加压力,让孙权不能杀刘备
- 返回蜀国之前:求吴国太放行
- 吴国追兵到来后:让孙夫人断后,拦住追兵
类图如下:
策略接口及其实现类:
/**
* @Description: 策略接口
*/
public interface IStrategy {
// 每个锦囊妙计都是一个可执行的算法
public void operate();
}
/**
* @Description: 第一个策略:找乔国老帮忙,让孙权不能杀刘备
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
/**
* @Description: 第二个策略:求吴国太开个绿灯,放行
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
}
}
/**
* @Description: 第三个策略:孙夫人断后,挡住追兵
*/
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
定义一个类,用于存在锦囊妙计:
/**
* @Description: 保存策略对象,提供调用策略的方法
*/
public class Context {
private IStrategy straegy;
// 构造函数,用于定义使用哪个策略
public Context(IStrategy straegy) {
this.straegy = straegy;
}
// 使用策略
public void operate() {
straegy.operate();
}
}
客户端赵云,调用策略:
public class ZhaoYun {
/**
* 客户端赵云,一次拆开锦囊妙计
*/
public static void main(String[] args) {
Context context;
// 刚到吴国的时候拆第一个
System.out.println("========== 刚刚到吴国的时候拆第一个 ==========");
context = new Context(new BackDoor()); // 拿到妙计
context.operate(); // 执行第一个策略
System.out.println();
// 返回蜀国前拆第二个
System.out.println("========== 返回蜀国前拆第二个 ==========");
context = new Context(new GivenGreenLight()); // 拿到妙计
context.operate(); // 执行第二个策略
System.out.println();
// 吴国追兵到达后拆第三个
System.out.println("========== 吴国追兵到达后拆第三个 ==========");
context = new Context(new BlockEnemy()); // 拿到妙计
context.operate(); // 执行第三个策略
System.out.println();
}
}
这就是策略模式,体现了高内聚低耦合的特点,而且扩展性较高,策略类可以继续增加。
本文原书:《您的设计模式》 作者:CBF4LIFE