隨筆-48  評論-26  文章-0  trackbacks-0
            策略模式設計原則(幾乎所有的模式都是如此):

            1.找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起。

            2.針對接口編程而不是實現.

            3.多用組合,少用繼承.

            策略模式定義:定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。

            PS:算法族即行為族 

            使用策略模式構建一個小應用,比如在鳥類中最基本的行為族(也就是算法族) 飛行與鳴叫,而每種鳥的行為甚至都不一致,如果要你寫個程序來演示鳥類(各類別),你該怎么做?

            參看策略模式的定義:定義算法族,分別封裝起來。

            我們可以將飛行與鳴叫的定義封裝成接口,參看代碼:

            /**

           * 飛行基類
           * 
          @author BruceLeey
           
          */
          public interface IFly {

              
          public void fly();

          /**
           * 叫喚基類
           * 
          @author BruceLeey
           
          */
          public interface IYell {

              
          public void yell();
          }

          根據不同鳥類飛行的特點生成飛行與鳴叫的實現,比如:

           /**

           * 麻雀飛行實現類
           * 
          @author BruceLeey
           
          */
          public class MaqFly implements IFly{

              
          public void fly() {
                 System.out.println(
          "麻雀飛起來小巧,速度慢!");
              }

          }


          /**
           * 老鷹飛行的實現類
           * 
          @author BruceLeey
           
          */
          public class YingFly implements IFly{

              
          public void fly() {
                  System.out.println(
          "老鷹的飛行速度很快,獵物幾乎無處可逃!");
              }

          鳥類中也存在不會飛的鳥,比如鴕鳥

          /**
           * 不會飛
           * 
          @author BruceLeey
           
          */
          public class NowayFly implements IFly{

              
          public void fly() {
                  System.out.println(
          "很抱歉,它不會飛!");
              }

            鳴叫的實現也是如此。接下來我們就可以定義鳥類的基本類了。

            /**

           * 鳥類基類
           * 
          @author BruceLeey
           
          */
          public abstract class Bird {

              
          private IFly fly;
              
          private IYell yell;

              
          public void fly() {
                  fly.fly();
              }

              
          public void yell() {
                  yell.yell();
              }
              
          public abstract void display();  

              
          public void setIFly(IFly fly) {
                  
          this.fly = fly;
              }

              
          public IFly getIFly() {
                  
          return this.fly;
              }

              
          public void setIYell(IYell yell) {
                  
          this.yell = yell;
              }

              
          public IYell getIYell() {
                  
          return this.yell;
              }
          }

            算法族由GetSet傾入,在基類中將行為實現,但不具體指定,具體指定留由客戶。麻雀類實現如下,其他的寫法亦是如此。

            /**

           * 麻雀
           * 
          @author BruceLeey
           
          */
          public class Maq extends Bird{
              
              @Override
              
          public void display() {
                  System.out.println(
          "我是麻雀!!!");
              }

          }  

           在麻雀的實現類里我們已經將行為委托到父類,父類則委托給對應的行為接口,這就是:針對接口編程而不是實現。

           測試代碼與測試信息如下:

           /**

           *
           * 
          @author BruceLeey
           
          */
          public class TestBird extends TestCase{
              
          public void testMaq() {
                  Bird bird
          =new Maq();
                  bird.setIFly(
          new MaqFly());
                  bird.setIYell(
          new MaqYell());
                  bird.display();
                  bird.fly();
                  bird.yell();
              }
               
          public void testYing() {
                  Bird bird
          =new Ying();
                  bird.setIFly(
          new YingFly());
                  bird.setIYell(
          new YingYell());
                  bird.display();
                  bird.fly();
                  bird.yell();
              }
                
          public void testTuon() {
                  Bird bird
          =new Tuon();
                  bird.setIFly(
          new NowayFly());
                  bird.setIYell(
          new TuonYell());
                  bird.display();
                  bird.fly();
                  bird.yell();
              }
          }

          輸出如下:

          我是麻雀!!!

          麻雀飛起來小巧,速度慢!

          麻雀叫起來吱吱的聲音~~~

          我是老鷹!!!

          老鷹的飛行速度很快,獵物幾乎無處可逃!

          老鷹叫喚起來是:嘯~~~~

          我是鴕鳥!!!

          很抱歉,它不會飛!

          鴕鳥叫喚起來我也不知道~~~--#

           

          參考資料:《Head First Designer pattern》

          posted on 2009-09-26 14:47 Worker 閱讀(223) 評論(0)  編輯  收藏 所屬分類: 設計模式

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


          網站導航:
           

          主站蜘蛛池模板: 沐川县| 广灵县| 裕民县| 蚌埠市| 沅江市| 于都县| 紫金县| 云南省| 民县| 永修县| 盐池县| 工布江达县| 定州市| 荔浦县| 锦州市| 东乡族自治县| 黄龙县| 盖州市| 威信县| 山西省| 象州县| 赤水市| 车险| 浦东新区| 菏泽市| 上饶县| 松滋市| 镇远县| 炉霍县| 双牌县| 安仁县| 舞阳县| 西平县| 德清县| 陈巴尔虎旗| 开化县| 澎湖县| 永德县| 邵阳县| 张家口市| 油尖旺区|