Strategy(策略)

          中心思想:
          ????? 把變化的部分和不變的部分隔離開來。用接口來“抽取”
          出來。

          實現:

          實際整個Strategy的核心部分就是抽象類的使用,【可以用接口,】(用抽象類聲明對象變量引用不同的子類對象)使用Strategy模式可以在用戶需要變化時,修改量很少,而且快速.

          Strategy 適合下列場合:

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

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

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

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



          具體操作步驟:
          ???

          這里以字符串替代為例, 有一個文件,我們需要讀取后,希望替代其中相應的變量,然后輸出.關于替代其中變量的方法可能有多種方法,這取決于用戶的要求,所以我們要準備幾套變量字符替代方案.


          1,我們建立一個抽象類RepTempRule定義一些公用變量和方法:

          ?1 public ? abstract ? class ?RepTempRule {
          ?2
          ?3 protected ?String?oldString = "" ;
          ?4 public ? void ?setOldString(String?oldString) {
          ?5    this .oldString = oldString;?
          ?6 }

          ?7
          ?8 protected ?String?newString = "" ;
          ?9 public ?String?getNewString() {
          10    return ?newString;
          11 }

          12 // 以上是公共變量和方法
          13 public ? abstract ? void ?replace()? throws ?Exception;
          14
          15 }

          RepTempRule中有一個抽象方法abstract需要繼承明確,這個replace()里其實是替代的具體方法.

          2,兩種方案的實現類,實現抽象方法replace()?
          public class RepTempRuleTwo extends RepTempRule
          public class RepTempRuleOne extends RepTempRule


          3,我們要建立一個算法解決類,用來提供客戶端可以自由選擇算法。

          ?

          ?1 public ? class ?RepTempRuleSolve? {?
          ?2
          ?3 private ?RepTempRule?strategy;? // 抽象類不可以生成對象,但是可以生成對象變量,去引用已經實現抽象方法的子類
          ?4
          ?5    public ?RepTempRuleSolve(RepTempRule?rule) {
          ?6      this .strategy = rule;
          ?7   }

          ?8
          ?9
          10
          11    public ?String?getNewContext(Site?site,String?oldString)? {
          12      return ?strategy.replace(site,oldString);
          13   }

          14
          15    public ? void ?changeAlgorithm(RepTempRule?newAlgorithm)? {?? // 通過該方法動態改變strategy
          16     strategy? = ?newAlgorithm;
          17
          18 }

          19

          ?


          4,程序中使用。可以方便的切換實現方案。

          ??? // 使用第一套替代方案
            RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleOne ());
            solver.getNewContext(site,context);

            //使用第二套

            solver=new RepTempRuleSolve(new RepTempRuleTwo());
            solver.getNewContext(site,context);




          ?

          posted on 2009-04-11 01:35 luofeng225 閱讀(203) 評論(0)  編輯  收藏 所屬分類: 設計模式

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          導航

          統計

          公告

          我曾經聽到這么一個故事: 一個年輕的程序員問一個老程序員(一個比較牛逼的公司的CTO) 年輕程序員: 你為什么這么牛X., 就好像沒有你不會的。老程序員: 積累的。年輕程序員: 怎么才能積累到您的程度呢。我每天都在積累。但是似乎都沒有感覺到進步。老程序員: 我從20歲開始做到了一件事情,直到今天,而且盡可能地保證不間斷。年輕程序員: 到底是什么? 老程序員: 我每天保證自己有2個小時在學習新的東西。

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          收藏夾

          Java Website

          java技術博客

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂宁市| 平和县| 徐州市| 库车县| 丹棱县| 隆林| 瓮安县| 原阳县| 柳林县| 阿合奇县| 炉霍县| 晋江市| 信阳市| 南川市| 卢湾区| 通城县| 达孜县| 天峻县| 岳西县| 文登市| 兴仁县| 来宾市| 定结县| 鲁甸县| 台前县| 乐安县| 罗源县| 嵊泗县| 黔东| 民勤县| 潼南县| 阜宁县| 三都| 三台县| 潞城市| 金沙县| 和林格尔县| 黑山县| 静海县| 浦县| 都江堰市|