一天學一個模式_第一天:策略模式

  • 610
  • 0

概念:策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立于使用它的客戶而獨立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable.
Strategy lets the algorithm vary independently from clients that use it.)抽象策略角色:策略類,通常由一個介面或者抽象類別實現。

概念:

  策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立于使用它的客戶而獨立變化。
     (原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. 
Strategy lets the algorithm vary independently from clients that use it.)

抽象策略角色: 
       策略類,通常由一個介面或者抽象類別實現。

步驟:
     (①②步比較菜,忽略。有異議者聯繫!)
      ①首先定義一個策略介面
      ②然後再寫出你需要的實現類(這裡稱為“計謀”)去繼承①策略介面。
      ③計謀有了,那還要有錦囊裝

       /** 
        * @author wonter  
        * <b>描述:</b>計謀有了,那還要有錦囊裝 <br>
        * <b>郵件:</b> yiyu1@163.com <br>
        */ 
       public class Box { 
     //①策略介面
     private IStrategy straegy; 
     //向錦囊中傳入計謀 
     //這裡類型是策略IStrategy介面,但傳入的則是“實現”介面的計謀。
     public Box(IStrategy jimou){ 
     //改寫策略
          this.straegy = jimou; 
      } 
     //使用計謀 
     public void operate(){ 
          this.straegy.operate(); 
      } 
       }

          ④使用計謀

   /** 
    * @author wonter  
    * <b>描述:</b>計謀有了,那還要有錦囊裝 <br>
    * <b>郵件:</b> yiyu1@163.com <br>
    */ 
      public class YunZhao { 
    public static void main(String[] args) { 
     //將錦囊聲明出來 
     Context context; 
     System.out.println("—— 錦囊妙計一 ——"); 
     //向錦囊拿出**計謀
     context = new Context(new first()); 
      //執行計謀
     context.operate();  
     System.out.println("—— 錦囊妙計二 ——"); 
     //向錦囊拿出**計謀
     context = new Context(new second()); 
      //執行計謀
     context.operate();  
     System.out.println("—— 以下待為擴展 ——"); 
     System.out.println("——        ... ....       ——"); 
      }
好處:
       這就是策略模式,高內聚低耦合的特點也表現出來了。
       還有一個就是擴展性,也就是 OCP原則,只要修改 Context.java 就可以了。
       提供了一種替代繼承的方法,而且既保持了繼承的優點(代碼重用)還比繼承更靈活(演算法獨立,可以任意擴展)。 
       避免程式中使用多重條件轉移語句,使系統更靈活,並易於擴展。 
 /** 
    * @author wonter  
    * <b>描述:</b> 一天學一個模式 更新中,請關注我的博客! <br>

    * <b>博客:</b> http://www.cnblogs.com/Javame <br>
    * <b>郵件:</b> yiyu1@163.com <br>
    */