posts - 262,  comments - 221,  trackbacks - 0
          注:本文參考了《Java設(shè)計(jì)模式》一書(shū)和WWW.jdon.com網(wǎng)站的《Strategy模式》一章

          一、Strategy模式的意圖:


          策略操作定義了策略的輸入和輸出,而把策略的實(shí)現(xiàn)工作留給了各個(gè)類(lèi)。這些類(lèi)以不同的方案來(lái)實(shí)現(xiàn)同一操作,它們?yōu)橛脩?hù)提供統(tǒng)一的接口,因而這些類(lèi)可以相互替換。

          Strategy模式允許多種策略共存,而代碼不會(huì)混亂。策略模式也可以實(shí)現(xiàn)模式選擇邏輯和策略本身相分離。

          Strategy模式的意圖在于把可選的策略或方案封裝在不同的類(lèi)中,并在這些類(lèi)中實(shí)現(xiàn)一個(gè)共同的操作

          二、Strategy模式的例子:

          ·抽象父類(lèi):
          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;

          }

          ·繼承子類(lèi):
          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");   
              }

          }

          ·幫助類(lèi):
          public class RepTempRuleSolve 
                
          // 當(dāng)前的策略
            private RepTempRule strategy;

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


                
          // 根據(jù)當(dāng)前策略處理用戶(hù)的請(qǐng)求
           public String getNewContext(Site site,String oldString) {
              
          return strategy.replace(site,oldString);
            }


                
          // 動(dòng)態(tài)切換策略
             public void changeAlgorithm(RepTempRule newAlgorithm) {
              strategy 
          = newAlgorithm;
            }

          }

          三、Strategy模式的特點(diǎn):

          ·有一個(gè)抽象的父類(lèi)/接口,在其中定義了操作的模板(類(lèi)似于Template模式)
          ·有一至多個(gè)實(shí)現(xiàn)類(lèi)或子類(lèi),實(shí)現(xiàn)了父類(lèi)/接口中的模板方法
          ·有一個(gè)可供客戶(hù)端動(dòng)態(tài)切換算法的幫助類(lèi),該類(lèi)擁有一個(gè)策略對(duì)象,可以在初始化時(shí)指定默認(rèn)的策略,也可以在運(yùn)行時(shí)通過(guò)set方法動(dòng)態(tài)切換策略

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

          ·Strage模式與State模式的比較

          在對(duì)狀態(tài)進(jìn)行建模時(shí),狀態(tài)的遷移是一個(gè)重要的方面(即如何切換到上、下一個(gè)狀態(tài));而在對(duì)策略進(jìn)行建模時(shí),遷移與策略的選擇并不相關(guān)(即關(guān)注的是操作的策略,對(duì)象狀態(tài)的切換并不是關(guān)注的方面)。

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

          ·Strategy模式與Template模式的比較

          Strategy模式的最大特點(diǎn)是可以在運(yùn)行期間動(dòng)態(tài)地切換算法。這一點(diǎn)和“Template”模式有點(diǎn)不同,后者雖然也提供抽象的模板框架,并且由子類(lèi)繼承實(shí)現(xiàn),Template模式一般在確定之后的運(yùn)行期間就不會(huì)再次切換了。而前者可以或者說(shuō)需要在運(yùn)行期間動(dòng)態(tài)地切換

          五、Strategy模式的適用場(chǎng)合:

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

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

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

          4.以不同的格式輸出同樣數(shù)據(jù)的圖形,比如曲線(xiàn) 或框圖bar等



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


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

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

          常用鏈接

          留言簿(21)

          隨筆分類(lèi)

          隨筆檔案

          BlogJava熱點(diǎn)博客

          好友博客

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 介休市| 黄梅县| 白沙| 汪清县| 孝义市| 白水县| 左云县| 小金县| 麟游县| 灵石县| 禹州市| 青河县| 亚东县| 合作市| 拉孜县| 晋宁县| 合阳县| 宜州市| 山东省| 广西| 麻江县| 瑞金市| 西丰县| 尼勒克县| 乌拉特后旗| 高台县| 沾化县| 鄂托克旗| 益阳市| 侯马市| 樟树市| 黄平县| 博乐市| 万载县| 崇阳县| 翁源县| 乌兰县| 沿河| 金塔县| 阿克陶县| 石家庄市|