设计模式之策略模式

88 阅读2分钟

案例:刘备娶亲

刘备到江东娶媳妇儿,临行前诸葛亮给随行的赵云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