策略模式

1、策略模式:将不同的策略封装在不同类的某个方法中(具体策略实现类)。将这个方法抽象成一个接口的方法(抽象策略类)。用一个具体策略对象来配置,维护一个对策略对象的引用(环境类)。客户端调用环境类( 调用者)。

要完成一个目标可以有多个算法:

  1.要把多个算法抽象成一个接口

  2.每种算法用一个实现类来定义具体的实现

  4.调用实现类的具体实现方法

  5.使用方选择具体的算法实现

 

案例 :

场景如下,刘备要到江东娶老婆了,走之前诸葛亮给赵云三个锦囊妙计,说是按天机拆开能解决棘手问题。场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。
 
抽象策略类(Strategy)
[java] view plain copy
 
  1. public interface Strategy {  
  2.      public void operate();  
  3. }  
三个实现类(ConcreteStrategy):
妙计一:初到吴国
[java] view plain copy
 
  1. public class BackDoor implements IStrategy {  
  2.      @Override  
  3.      public void operate() {  
  4.           System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");  
  5.      }  
  6. }  
妙计二:求吴国太开绿灯放行
[java] view plain copy
 
  1. public class GivenGreenLight implements IStrategy {  
  2.      @Override  
  3.      public void operate() {  
  4.           System.out.println("求吴国太开个绿灯,放行");  
  5.      }  
  6. }  
妙计三:孙夫人断后,挡住追兵
[java] view plain copy
 
  1. public class BlackEnemy implements IStrategy {  
  2.      @Override  
  3.      public void operate() {  
  4.           System.out.println("孙夫人断后,挡住追兵");  
  5.      }  
  6. }  

环境类(Context)
[java] view plain copy
 
  1. public class Context {  
  2.      private Strategy strategy;  
  3.      //构造函数,要你使用哪个妙计  
  4.      public Context(Strategy strategy){  
  5.           this.strategy = strategy;  
  6.      }  
  7.      public void setStrategy(Strategy strategy){  
  8.           this.strategy = strategy;  
  9.      }  
  10.      public void operate(){  
  11.           this.strategy.operate();  
  12.      }  
  13. }  

下面就是使用的情况了
[java] view plain copy
 
  1. public class Zhaoyun {  
  2.   
  3. public static void main(String[] args) {  
  4.      Context context;  
  5.   
  6.      System.out.println("----------刚到吴国使用第一个锦囊---------------");  
  7.      context = new Context(new BackDoor());  
  8.      context.operate();  
  9.      System.out.println("\n");  
  10.   
  11.      System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");  
  12.      context.setStrategy(new GivenGreenLight());  
  13.      context.operate();  
  14.      System.out.println("\n");  
  15.   
  16.      System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");  
  17.      context.setStrategy(new BlackEnemy());  
  18.      context.operate();  
  19.      System.out.println("\n");  
  20.      }  
  21. }  
posted @ 2017-11-01 11:43  不缺重头再来的勇气  阅读(110)  评论(0编辑  收藏  举报