Java设计模式1——策略模式(Strategy Pattern)

  最近觅得一本好书《您的设计模式》,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解,用自己的方式记录下来。

  上第一章的策略模式之前讲个故事,解释一下类设计的背景:刘备要去江东娶老婆,临走时诸葛亮给伴郎赵云三个锦囊妙计,嘱咐按天机拆开解决棘手问题。这才有了后来的周瑜赔了夫人又折兵。三个妙计放在锦囊中,赵云从锦囊中取妙计获胜。先看类图:

1.三个妙计是具体的实现类,我们设计一个接口,再写三个实现类:  

public interface IStrategy {
  //每个锦囊妙计都是一个可执行的算法
  public void operate();
}

public class BackDoor implements IStrategy {
  public void operate() {
  System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
  }
}

public class GivenGreenLight implements IStrategy {
  public void operate() {
  System.out.println("求吴国太开个绿灯,放行!");
  }
}

public class BlockEnemy implements IStrategy {
  public void operate() {
  System.out.println("孙夫人断后,挡住追兵");
  }
}

2.三个妙计有了,装在锦囊里,需要设计一个入口类,方便赵云调用:

public class Context {
  //构造函数,你要使用哪个妙计
  private IStrategy straegy;
  public Context(IStrategy strategy){
  this.straegy = strategy;
  }
  //使用计谋,看我出招
  public void operate(){
  this.straegy.operate();
  }
}

3.赵云出场,挨个拆开妙计,周瑜接招:

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(" ");
    /*
    *问题来了:赵云实际不知道是那个策略呀,他只知道拆第一个锦囊,
    *而不知道是BackDoor这个妙计,咋办? 似乎这个策略模式已经把计谋名称写出来了
    ** 错! BackDoor、 GivenGreenLight、 BlockEnemy只是一个代码, 你写成first、 second、third,没人会说你错!    
    */
  }
}

4.这就是策略模式,高内聚低耦合,而且扩展性好,要增加策略类,修改Context.java就行,所以应用广泛。

原文地址:https://www.cnblogs.com/lucy-lily/p/4914815.html