隨筆 - 0, 文章 - 1, 評論 - 0, 引用 - 0
          數據加載中……

          【轉】Java策略模式

          1.策略模式概念
              策略模式(Strategy Pattern)體現了兩個非常基本的面向對象設計原則。
              1> 封裝變化概念 ;
              2> 編程中使用接口,而不是對接口的實現,即面向接口編程。
          2.定義:
              1> 定義一組算法,將每個算法都封裝起來,并且使他們之間可以作為組建互相替換;
              2> 策略模式使這些算法在客戶端調用它們的時候能夠互不影響的變化。
          3.意義:
              1> 策略模式使開發人員能夠開發出由許多可替換的部分組成的軟件,并且各部分之間是
              松耦合的關系;
              2> 若連接的特性是軟件具有更強的可擴展性,易于維護;更重要的是,他大大提高了軟件
              的可重用性。
          4.策略模式的組成:
              1> 抽象策略角色:策略類,通常由一個接口或者抽象類實現;
              2> 具體策略角色:包裝了相關的算法和行為,由實現接口或抽象類的類完成;
              3> 環境角色:持有一個策略類的引用,最后給客戶端調用。
          5.策略模式的實現:
              1> 策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立類中,
              從而使得它們可以相互替換;    
              2> 策略模式使得算法可以在不影響客戶端的情況下發生變化。使用策略模式可以把
              行為和環境分割開來;
              3> 環境類負責維持和查詢行為類,各種算法則在具體策略中提供。由于算法和環境
              相獨立,算法的修改都不會影響環境和客戶端。
          6.編寫步驟:
              1> 對策略對象定義一個公共接口(抽象策略角色);
              2> 編寫各種策略類,該類實現了上面的公共接口(具體策略角色);
              3> 在使用策略對象的類中保存一個策略對象的引用(環境角色);
              4> 在使用策略對象的類中,實現對策略對象的set和get方法(注入)或者使用構造方法完成賦值

          例1:
          Strategy.java(抽象策略角色,接口實現)
          package cn.edu.bupt.strategy;

          public interface Strategy {
              int calculate(int a, int b);
          }
          (具體策略角色,分為兩個實現類,如下)
          AddStrategy.java
           1 package cn.edu.bupt.strategy;
           2 
           3 public class AddStrategy implements Strategy {
           4 
           5     @Override
           6     public int calculate(int a, int b) {
           7         return a + b;
           8     }
           9 
          10 }
          11 
          SubstractStrategy.java
           1 package cn.edu.bupt.strategy;
           2 
           3 public class SubstractStrategy implements Strategy {
           4 
           5     @Override
           6     public int calculate(int a, int b) {
           7         return a - b;
           8     }
           9 
          10 }
          11 
          (環境角色,持有接口的引用但是沒有接口的具體實現類,即面向接口編程,擁有setters 和 getters)
          Environment.java
           1 package cn.edu.bupt.strategy;
           2 
           3 public class Environment {
           4     private Strategy stra;    //Strategy類型,面向接口編程
           5 
           6     public Environment(){
           7         super();
           8     }
           9     public Environment(Strategy stra) {
          10         super();
          11         this.stra = stra;
          12     }
          13 
          14     public Strategy getStra() {
          15         return this.stra;
          16     }
          17 
          18     public void setStra(Strategy stra) {
          19         this.stra = stra;
          20     }
          21     
          22     public int calculate(int a, int b) {
          23         return this.stra.calculate(a, b);
          24     }
          25 }
          26 
          (客戶端,持有環境類,但是需要通過使用setters 和 getters向環境類中傳入具體的算法,即策略具體實現類)
          Client.java
           1 package cn.edu.bupt.strategy;
           2 
           3 public class Client {
           4 
           5     /**
           6      * @param args
           7      */
           8     public static void main(String[] args) {
           9         // TODO Auto-generated method stub
          10         int a = 3;
          11         int b = 4;
          12         //實例化環境決策,完成相關的運算
          13         Environment env = new Environment();
          14         
          15         //傳入減法策略,執行減法運算
          16         env.setStra(new SubstractStrategy());
          17         System.out.println(env.calculate(a, b));
          18         
          19         //傳入加法策略,執行加法運算
          20         env.setStra(new AddStrategy());
          21         System.out.println(env.calculate(a, b));
          22     }
          23 
          24 }
          策略模式的缺點:
              1> 客戶端必須知道所有的實現算法的具體策略類,并自行解決使用哪個策略類;
              2> 會造成很多的抽象類。

          posted on 2012-01-30 19:11 阿童沐 閱讀(87) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 永济市| 大连市| 黎川县| 手游| 安宁市| 页游| 定日县| 北海市| 抚宁县| 吴川市| 运城市| 永和县| 抚州市| 永泰县| 通化县| 晋江市| 池州市| 额济纳旗| 井冈山市| 安溪县| 法库县| 门头沟区| 贞丰县| 新郑市| 鄂尔多斯市| 台州市| 辉南县| 凤山县| 化隆| 奉节县| 龙门县| 苏尼特右旗| 英超| 枝江市| 朝阳区| 嵊州市| 宜城市| 泸溪县| 阿合奇县| 鸡东县| 常山县|