Mark's Java Blog
          MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA
             策略模式定義了算法族,分別封裝起來(lái),讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。

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

          實(shí)例代碼:

          要求:所有的各類(lèi)鴨子繼承一個(gè)超類(lèi),并且可以擁有自己的特性,可以因?yàn)樾枨笞兓淖兡硞€(gè)鴨子或某一類(lèi)鴨子的某種特性(如可以改變叫聲和飛行狀態(tài))。

          //鴨子超類(lèi)
          public abstract class Duck {
          //飛行狀態(tài)算法族
           FlyBehavior flyBehavior;
          //鳴叫狀態(tài)算法族
           QuackBehavior quackBehavior;
           
           public Duck() {
           }
           //改變算法組狀態(tài)的方法,可是在運(yùn)行時(shí)改變特性的方法
           public void setFlyBehavior (FlyBehavior fb) {
            flyBehavior = fb;
           }
           
           public void setQuackBehavior(QuackBehavior qb) {
            quackBehavior = qb;
           }
           //由子類(lèi)繼承并實(shí)現(xiàn)的鴨子特性(不會(huì)改變)
           abstract void display();
           //由子類(lèi)繼承的飛行和鳴叫方法
           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();
          }

          //飛行狀態(tài)實(shí)現(xiàn)類(lèi)(不能飛)
          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();
          }

          //鳴叫狀態(tài)實(shí)現(xiàn)類(lèi)(不能叫)
          public class MuteQuack implements QuackBehavior {
           public void quack() {
            System.out.println("<< Silence >>");
           }
          }

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

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

          //測(cè)試程序

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

            decoy.performQuack();
             
            decoy .performFly(); 
          //運(yùn)行時(shí)把飛行狀態(tài)改為火箭助推器飛行
            decoy .setFlyBehavior(new FlyRocketPowered());
            decoy .performFly();
           }
          }

          posted on 2008-03-17 09:55 Mark 閱讀(597) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): 設(shè)計(jì)模式
          Comments
           
          主站蜘蛛池模板: 铜鼓县| 天柱县| 尖扎县| 霍城县| 郧西县| 贞丰县| 揭西县| 保靖县| 阳西县| 定安县| 永安市| 云林县| 尉犁县| 南投县| 鄢陵县| 青龙| 长岭县| 龙胜| 上栗县| 肃北| 黄浦区| 新乐市| 铜鼓县| 昆明市| 裕民县| 栾城县| 鹤峰县| 中山市| 巫山县| 德昌县| 册亨县| 江口县| 甘孜县| 玉林市| 岳阳县| 绍兴县| 饶阳县| 定日县| 崇仁县| 望奎县| 宜川县|