posts - 262,  comments - 221,  trackbacks - 0
          注:本文參考了《Java設計模式》一書和WWW.jdon.com網站的《Strategy模式》一章

          一、Strategy模式的意圖:


          策略操作定義了策略的輸入和輸出,而把策略的實現工作留給了各個類。這些類以不同的方案來實現同一操作,它們為用戶提供統一的接口,因而這些類可以相互替換。

          Strategy模式允許多種策略共存,而代碼不會混亂。策略模式也可以實現模式選擇邏輯和策略本身相分離。

          Strategy模式的意圖在于把可選的策略或方案封裝在不同的類中,并在這些類中實現一個共同的操作

          二、Strategy模式的例子:

          ·抽象父類:
          public abstract class RepTempRule{

          protected String oldString="";

          public void setOldString(String oldString){
            
          this.oldString=oldString; 
          }


          protected String newString="";

          public String getNewString(){
            
          return newString;
          }


          public abstract void replace() throws Exception;

          }

          ·繼承子類:
          public class RepTempRuleOne extends RepTempRule{

              
          public void replace() throws Exception
                
          //replaceFirst是jdk1.4新特性 
              newString=oldString.replaceFirst("aaa""bbbb"
              System.out.println(
          "this is replace one");   
              }

          }

          public class RepTempRuleTwo extends RepTempRule{

              
          public void replace() throws Exception
                newString
          =oldString.replaceFirst("aaa""ccc"
              System.out.println(
          "this is replace Two");   
              }

          }

          ·幫助類:
          public class RepTempRuleSolve 
                
          // 當前的策略
            private RepTempRule strategy;

                
          // 初始化時指定默認的策略
             public RepTempRuleSolve(RepTempRule rule){
              
          this.strategy=rule;
            }


                
          // 根據當前策略處理用戶的請求
           public String getNewContext(Site site,String oldString) {
              
          return strategy.replace(site,oldString);
            }


                
          // 動態切換策略
             public void changeAlgorithm(RepTempRule newAlgorithm) {
              strategy 
          = newAlgorithm;
            }

          }

          三、Strategy模式的特點:

          ·有一個抽象的父類/接口,在其中定義了操作的模板(類似于Template模式)
          ·有一至多個實現類或子類,實現了父類/接口中的模板方法
          ·有一個可供客戶端動態切換算法的幫助類,該類擁有一個策略對象,可以在初始化時指定默認的策略,也可以在運行時通過set方法動態切換策略

          四、Strategy模式與其它模式的比較:

          ·Strage模式與State模式的比較

          在對狀態進行建模時,狀態的遷移是一個重要的方面(即如何切換到上、下一個狀態);而在對策略進行建模時,遷移與策略的選擇并不相關(即關注的是操作的策略,對象狀態的切換并不是關注的方面)。

          另外一個不同之處就是,Strategy模式可能允許客戶選擇或者提供一個策略,而State模式卻很少設計這樣的思路。

          ·Strategy模式與Template模式的比較

          Strategy模式的最大特點是可以在運行期間動態地切換算法。這一點和“Template”模式有點不同,后者雖然也提供抽象的模板框架,并且由子類繼承實現,Template模式一般在確定之后的運行期間就不會再次切換了。而前者可以或者說需要在運行期間動態地切換

          五、Strategy模式的適用場合:

          1.以不同的格式保存文件;

          2.以不同的算法壓縮文件;

          3.以不同的算法截獲圖象;

          4.以不同的格式輸出同樣數據的圖形,比如曲線 或框圖bar等



          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-04-08 11:52 Paul Lin 閱讀(5373) 評論(2)  編輯  收藏 所屬分類: 模式與重構


          FeedBack:
          # re: 設計模式總結-Strategy模式
          2008-04-13 09:23 | applupus
          幫助類的代碼是不是有問題?
          return strategy.replace(site,oldString);

          策略中的方法是replace(),是不帶參數的。  回復  更多評論
            
          # re: 設計模式總結-Strategy模式[未登錄]
          2012-04-02 13:13 | vince
          這個例子做Strategy不太合適  回復  更多評論
            
          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泾阳县| 渭南市| 黎平县| 资溪县| 大悟县| 鲁山县| 阳原县| 灵川县| 新丰县| 西和县| 江山市| 黄梅县| 辉县市| 长泰县| 溧水县| 包头市| 巴楚县| 黑水县| 若尔盖县| 丘北县| 普格县| 蓬莱市| 姜堰市| 海伦市| 府谷县| 浮梁县| 丰宁| 石台县| 马龙县| 达尔| 西乌珠穆沁旗| 屏南县| 远安县| 丽江市| 合水县| 宁晋县| 宜春市| 宿松县| 太和县| 长葛市| 泰来县|