posts - 297,  comments - 1618,  trackbacks - 0

                   策略模式(strategy) 屬于對象的行為模式
             1. 定義
                  定義一系列的算法,把這些算法一個個封裝成單獨的類.策略模式是對算法的封裝,是把使用算法的責任和算法本身分割開,委派給不同的對象管理.
             2. 使用的原因
                  在某些情況下,當客戶端需求不同時,會要求不同的算法實現,為使算法的增減,修改都不會影響環境和客戶端,可采用策略模式解決此種情況。  
             3. 適用的情況舉例
                
          1)一電子商務網站對各類書提供不同的折扣算法,有的沒有折扣,有的提供10%的折扣,那么在計算圖書的價格時,為防止通過過多而擴展性差的選擇語句來決定采取何種折扣算法,可采取策略算法有效解決問題;
                 2)假使你是一推銷員,你腦海中已存儲了很多種推銷方法,每種方法適應一類人群,當你去推銷時,你要根據不同的對象去決定該用何種方式推銷;
                 3)很多人在追求MM時,會根據不同的MM做出不同的追求策略,有的MM喜歡天南海北的玩,有的MM喜歡肆無忌憚的吃,有的MM喜歡成天成天的打扮,有的......,情場老手會根據具體情況具體分析,而有些不開竅的人,采取統一策略,而且在判斷失誤時不會做出策略改變,導致屢戰屢敗,都是因為策略模式沒學好的結果(啊哈,跟我一起上補習班)。
             4. 類圖結構及說明
                  
          1) 簡略類圖
                    
                 2)說明
                      左上邊的類為環境(Context)角色,它只有一個Strategy類的應用;
                      右上方的類為抽象策略角色,通常為抽象類或接口;
                      下方的三個類繼承自抽象策略類,它們屬于不同的具體策略實現類。它們包裝了相關的算法和行為。
             5. 應用舉例
                  
          1)問題背景
                       在評議某老師的教學情況時,可能采取如下方式:
                       讓所教的班的學生對學校定出的評議老師的各項指標進行打分,最后統計該老師所得的平均分數,如果平均分在60分以上,就算教學合格。
                      還可能采取如下方式:
                      讓學生在“合格”、“基本合格”和“不合格”中勾選一項,最后統計認為選擇“合格”與“基本合格”的比例,如果超過60%就算教學情況合格。
                      還可能有其他種方式。
                   2)考慮方案
                      a)最不“雅觀"的實現方案
                           將所有的業務邏輯都放在客戶端中,利用條件選擇語句決定使用哪一個算法。
                           缺點:當增加新的方式時,需大量修改客戶端代碼,使得客戶端難以維護。
                      b)比a方案進了一步,考慮在客戶端加入繼承,不同方式的算法在不同的子類中實現,但因此時環境和行為耦合在了一起,造成兩者不能單獨演化。
                      c)針對b方案的環境和行為耦合在一起了這個缺點,將環境和行為分開。環境負責的工作是負責維護和查詢行為類,而各行為類負責算法的實現。c方案的實現其實就是策略模式的應用。
                  3)代碼模擬實現
                         待補充。
          參考書籍:《Java與模式》
                              《Patterns in Java》

          posted on 2007-04-11 00:11 阿蜜果 閱讀(2345) 評論(17)  編輯  收藏 所屬分類: Design Pattern


          FeedBack:
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 00:16 | αβγ
          沙發  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 00:24 | αβγ
          期待完善。希望能提供實例。  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 08:52 | 阿蜜果
          呵呵,昨晚累了,今晚繼續,啊哈
          今日廣州陽光真好噢!  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 09:13 | 劉甘泉
          我來給個實例
          //A策略
          public class Astragety implements Istragety{

          public String doSomething(String ori) {
          return ori+"AA";
          }
          }
          //B策略
          public class Bstragety implements Istragety{
          public String doSomething(String ori) {
          return ori+"BB";
          }
          }
          //策略接口
          public interface Istragety {
          public String doSomething(String ori);
          }
          //使用策略的上下文
          public class StragetyContext {
          private Istragety istragety;

          public void setIstragety(Istragety istragety) {
          this.istragety = istragety;
          }

          public void doWhatUWant(){
          System.out.println(istragety.doSomething("what u want:"));
          }
          }

          //開始使用吧~~~~~
          public class Stragety {
          public static void main(String[] args) {
          StragetyContext stragetyContext = new StragetyContext();
          stragetyContext.setIstragety(new Astragety());
          stragetyContext.doWhatUWant();
          stragetyContext.setIstragety(new Bstragety());
          stragetyContext.doWhatUWant();
          }
          }  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 09:20 | 藍色天空的囚徒
          贊一個.  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 09:21 | cresposhi
          so good  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 09:41 | coolfish
          學完了策略模式,希望樓主拿 模板方法 模式 做個對比,寫點心得. 深入理解 繼承和委派的區別.  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 10:09 | 劉甘泉
          模板模式和策略模式沒有相同的東西~~~~~~~
          模板模式是用于去除重復代碼的。。
          策略是用于不同的環境下的不同解決方法  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)[未登錄]
          2007-04-11 10:30 | 阿蜜果
          @coolfish
          多謝建議。  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 13:48 | @#$%
          不錯
          挺巧的  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 17:30 | G_G
          我 提個意見 把 
          這還有 硬代碼的 填充 stragetyContext.setIstragety(new Astragety());

          我們可以 用 Spring 來填充它哦!!!

          那這個 就無敵了 哈哈   回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 17:39 | cresposhi
          @G_G
          大哥,MM是在做設計模式的sample。。。怎么spring都來了。。。
          用spring填充那是另外幾種模式的結合。。。
          順便說一句IoC也就是DI模式也不是無敵的 :(  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 21:22 | 阿蜜果
          @@#$%
          ?巧什么
            回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-11 21:26 | 阿蜜果
          @劉甘泉
          嘻嘻,不錯!  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)
          2007-04-13 14:08 | hs
          八錯!八錯!  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)[未登錄]
          2007-11-09 10:51 | Steve
          Is this just identical with Bridge Pattern ?  回復  更多評論
            
          # re: 設計模式學習筆記--策略模式(待續)[未登錄]
          2007-11-09 11:04 | 阿蜜果
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296322
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新竹市| 崇左市| 郑州市| 浮山县| 横峰县| 石台县| 岫岩| 宁海县| 舞钢市| 玉门市| 西青区| 安平县| 谷城县| 连州市| 大关县| 宁陵县| 滕州市| 广州市| 凤阳县| 鞍山市| 建瓯市| 阳城县| 油尖旺区| 阜新| 雷州市| 廊坊市| 和静县| 方城县| 都江堰市| 石渠县| 尼勒克县| 亚东县| 阿城市| 博罗县| 丹寨县| 镶黄旗| 五寨县| 无为县| 汉川市| 罗源县| 崇仁县|