计策模式(Strategy)

策略模式(Strategy)
java设计模式 写道
      策略模式在在给定的输入条件下,实现某个目标的计划或者方案。策略与算法类似;算法是定义好的过程,它能够提供一组输入产生一个输出。而策略是一个计划,它也涉及如何从一组输入到一组输出。在通常情况之下,与算法相比,策略是能够提供更大范围的可选方案。因而,策略通常是代表一组或一簇相互替换的方案。

当计算机程序存在多种策略时,程序代码会比较复杂。当有多个策略可用时,与策略相关的程序逻辑必须选择其中一个策略来执行,这时策略选择的程序代码可能变得很复杂,同时策略的逻辑通常也比较复杂,我们可以使用策略模式来整理这些代码。

策略操作定义策略的输入和输出,而把策略的实现工作留给各个类。这些类以不同的方案来实现同一个操作,它们为用户提供同一个接口,因而这些类可以相互替换。策略模式允许多种策略共存,而代码不会混乱。策略模式也可以实现模式选择逻辑和策略本身相分离。

 

 

   它的意图在于把可选的策略或方案封装在不同的类中,并在这些类中实现一个共同的操作。

 

例子相对简单:

   假如现在有四种策略可以提供给用户选择,根据用户的不同情况进行选择。当策略计划如果简单的有时候采用算法方法比较简单,但如果策略很复杂的时候,采用策略来管理我们的代码会相对比较明智。

   面对传统的方法,我们很多时候都会采用面向过程式的方法去实现:

有如下策略

Java代码 计策模式(Strategy)
  1. /**  
  2.  * 策略  
  3.  * @author Administrator  
  4.  *  
  5.  */  
  6. public class Stratery {   
  7.     protected String stratery;   
  8.     public Stratery(String stratery){   
  9.         this.stratery = stratery;   
  10.     }   
  11. }   
  12.   
  13.   
  14.   
  15. /**  
  16.  * 策略1  
  17.  * @author Administrator  
  18.  *  
  19.  */  
  20. public class Stratery1 extends Stratery {   
  21.     public Stratery1(String stratery){   
  22.         super(stratery);   
  23.     }   
  24. }   
  25.   
  26. /**  
  27.  * 策略2  
  28.  * @author Administrator  
  29.  *  
  30.  */  
  31. public class Stratery2 extends Stratery{   
  32.     public Stratery2(String stratery){   
  33.         super(stratery);   
  34.     }   
  35. }   
  36. /**  
  37.  * 策略3  
  38.  * @author Administrator  
  39.  *  
  40.  */  
  41. public class Stratery3 extends Stratery{   
  42.     public Stratery3(String stratery){   
  43.         super(stratery);   
  44.     }   
  45. }   

传统的实现方法如下:

 

Java代码 计策模式(Strategy)
  1.   public static Stratery get(int cas){   
  2.     switch (cas) {   
  3. case 1:   
  4.     return new Stratery1("策略1");   
  5. case 2:   
  6.     return new Stratery2("策略2");   
  7. case 3:   
  8.     return new Stratery1("策略3");   
  9. default:   
  10.     return null;   
  11. }   
  12.   }   

根据用户的情况返回。

 

 

下面仅对上面的代码进行重构,使其成为strategy模式

定义一个共同的接口:

 

Java代码 计策模式(Strategy)
  1. public interface Advisor {   
  2.     public Stratery getAdvisor();   
  3. }   

每个策略方案都实现这个接口:

 

Java代码 计策模式(Strategy)
  1. /**  
  2.  * 策略1  
  3.  * @author Administrator  
  4.  *  
  5.  */  
  6. public class Stratery1 extends Stratery implements Advisor{   
  7.     public Stratery1(String stratery){   
  8.         super(stratery);   
  9.     }   
  10.   
  11.     public Stratery1 getAdvisor() {   
  12.         // TODO Auto-generated method stub   
  13.         return this;   
  14.     }   
  15.     public String toString(){   
  16.         return stratery;   
  17.     }   
  18. }   

最后利用接口实现策略调用:

Java代码 计策模式(Strategy)
  1. public class New {   
  2.     public static Advisor getAdvisor(int cas) {   
  3.         switch (cas) {   
  4.         case 1:   
  5.             return new Stratery1("策略1").getAdvisor();   
  6.         case 2:   
  7.             return new Stratery2("策略2").getAdvisor();   
  8.         case 3:   
  9.             return new Stratery3("策略3").getAdvisor();   
  10.         default:   
  11.             return null;   
  12.         }   
  13.     }   
  14.     public static void main(String[] args) {   
  15.         Advisor a = getAdvisor(1);   
  16.         System.out.println(a);   
  17.     }   
  18. }   

 

重构的核心思想就是:将一个操作分布在一组相关的类中。