Mark's Java Blog
          MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA

          導航

          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910
          統計
          • 隨筆 - 30
          • 文章 - 1
          • 評論 - 16
          • 引用 - 0

          常用鏈接

          留言簿(1)

          隨筆分類(32)

          隨筆檔案(30)

          文章檔案(1)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 29852
          • 排名 - 1393

          最新評論

          閱讀排行榜

          評論排行榜

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

              個人理解:策略模式就是把父類中需要根據不同情況而變化的行為想成“一族算法”,并把它抽象出來變成兩個接口,在父類中包含這個接口類型的屬性,這樣就可以利用不同的接口實現類來改變這個行為。并且添加了getter,setter方法后可以在運行時隨意改變行為的實現,這樣就可以使我們的設計更加富有彈性,可以使我們的設計更加易于維護和擴展。

          實例代碼:

          要求:所有的各類鴨子繼承一個超類,并且可以擁有自己的特性,可以因為需求變化而改變某個鴨子或某一類鴨子的某種特性(如可以改變叫聲和飛行狀態)。

          //鴨子超類
          public abstract class Duck {
          //飛行狀態算法族
           FlyBehavior flyBehavior;
          //鳴叫狀態算法族
           QuackBehavior quackBehavior;
           
           public Duck() {
           }
           //改變算法組狀態的方法,可是在運行時改變特性的方法
           public void setFlyBehavior (FlyBehavior fb) {
            flyBehavior = fb;
           }
           
           public void setQuackBehavior(QuackBehavior qb) {
            quackBehavior = qb;
           }
           //由子類繼承并實現的鴨子特性(不會改變)
           abstract void display();
           //由子類繼承的飛行和鳴叫方法
           public void performFly() {
            flyBehavior.fly();
           }
           
           public void performQuack() {
            quackBehavior.quack();
           }
           
           public void swim() {
            System.out.println("All ducks float, even decoys!");
           }
          }

          //飛行接口
          public interface FlyBehavior {
           public void fly();
          }

          //飛行狀態實現類(不能飛)
          public class FlyNoWay implements FlyBehavior {
           public void fly() {
            System.out.println("I can't fly");
           }
          }

          //火箭助推器
          public class FlyRocketPowered implements FlyBehavior {
           public void fly() {
            System.out.println("I'm flying with a rocket");
           }
          }
          //鳴叫接口
          public interface QuackBehavior {
           public void quack();
          }

          //鳴叫狀態實現類(不能叫)
          public class MuteQuack implements QuackBehavior {
           public void quack() {
            System.out.println("<< Silence >>");
           }
          }

          //一個模型鴨的子類,在創建時指定特性
          public class DecoyDuck extends Duck {
          //在構造器中指定飛行特性和鳴叫特性(不能飛,不能叫)
           public DecoyDuck() {
            setFlyBehavior(new FlyNoWay());
            setQuackBehavior(new MuteQuack());
           }

           public void display() {
            System.out.println("I'm a duck Decoy");
           }
          }

          //測試程序

          public class MiniDuckSimulator {
           
           public static void main(String[] args) {
           
            DecoyDuck decoy = new DecoyDuck();

            decoy.performQuack();
             
            decoy .performFly(); 
          //運行時把飛行狀態改為火箭助推器飛行
            decoy .setFlyBehavior(new FlyRocketPowered());
            decoy .performFly();
           }
          }

          posted on 2008-03-17 09:55 Mark 閱讀(601) 評論(2)  編輯  收藏 所屬分類: 設計模式
          Comments
          • # re: 策略模式[未登錄]
            aa
            Posted @ 2008-12-03 14:51
            真的看不懂,抽象類有構選函數,有沒有搞錯?  回復  更多評論   
          • # re: 策略模式
            sy
            Posted @ 2009-10-21 22:52
            @aa
            白癡,為什么不能有  回復  更多評論   
           
          主站蜘蛛池模板: 临夏市| 金塔县| 武陟县| 高雄县| 宜川县| 南城县| 昆山市| 金堂县| 孙吴县| 丹棱县| 焦作市| 乐山市| 健康| 万山特区| 阳西县| 南丹县| 临夏市| 怀仁县| 饶阳县| 正定县| 神木县| 鹿泉市| 班玛县| 古交市| 太保市| 英德市| 万年县| 赤峰市| 英吉沙县| 新昌县| 东乌珠穆沁旗| 郑州市| 吐鲁番市| 锦屏县| 永清县| 始兴县| 时尚| 宜春市| 兴仁县| 津南区| 明溪县|