posts - 310, comments - 6939, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          【Head First設計模式】-Strategy模式

          Posted on 2008-01-10 10:33 詩特林 閱讀(2848) 評論(2)  編輯  收藏 所屬分類: DesignPattern
           

          Head First設計模式】-Strategy模式

            

          一、從訂餐開始

          小王和小劉兩人到餐廳點餐,兩人分別如下告訴廚師。

          小王:我要一杯加了香草冰淇淋的巧克力汽水。

          小劉:一個黑與白。

                 這兩人點的餐有什么不同呢?其實是一樣的,都是同一份。只是小劉用專業的名字說來出,廚師一聽就明白。但小王沒有,他不懂,因此他與廚師之間沒有“共享的詞匯”。共享的詞匯不僅方便顧客點餐,也讓廚師不用記太多的事。

                 設計模式就是讓我們與其它的開發人員之間的共享詞匯,一旦懂得這些共享詞匯,和其它開發人員之間的溝通就容易很多。也讓那些不懂設計模式的程序開始學習模式。設計模式可以把思考架構的層次提高到模式層面,而不僅僅停留在瑣碎的對象上。

           

          二、Strategy模式

           

          1、兩大原則

           

          設計模式真正體現的是Java的原則,而這些原則又通過這些優秀的模式反映出來。有些面向對象的原則,適用于所有的模式,當無法找到適當的模式解決問題時,這些原則就是唯一的標準了。Strategy模式體現了如下的兩大原則:

          l         針對接口編程,而不是針對實現編程。

          l         多用組合,少用繼承。

           

          2.傳統設計


           

           

          3.strategy設計


           

          三、代碼實現

           

          1.抽象類Duck.java

          package com.sterning.ch1_strategy;

          import com.sterning.ch1_strategy.behavior.FlyBehavior;
          import com.sterning.ch1_strategy.behavior.QuackBehavior;

          public abstract class Duck 
          {
              FlyBehavior flyBehavior;
              QuackBehavior quackBehavior;
              
              
          public void setFlyBehavior(FlyBehavior flyBehavior) 
          {
                  
          this.flyBehavior 
          = flyBehavior;
              }


              public
           void setQuackBehavior(QuackBehavior quackBehavior) {
                  
          this.quackBehavior 
          = quackBehavior;
              }


              public
           Duck(){
                  
              }

              
              public
           abstract void display();
              
              
          public void performFly()
          {
                  flyBehavior.fly();
              }

              
              public
           void performQuack(){
                  quackBehavior.quack();
              }

              
              public
           void swim(){
                  System.out.println(
          "All ducks float,even decoys!
          ");
              }

          }


           

          2.行為封裝類

           

          1)接口

          接口FlyBehavior.java

          package com.sterning.ch1_strategy.behavior;

          public interface FlyBehavior {
              
          public void fly();
          }


           

          接口FlyBehavior.java

          package com.sterning.ch1_strategy.behavior;

          public interface QuackBehavior {
              
          public void quack();
          }

           

           

          2)實現

           

          FlyNoWay.java

          package com.sterning.ch1_strategy.behavior.impl;

          import com.sterning.ch1_strategy.behavior.FlyBehavior;

          public class FlyNoWay implements FlyBehavior {

              
          public void fly() {
                  System.out.println(
          "I can't fly!");
              }


          }


           

          FlyRocketPowered.java

          package com.sterning.ch1_strategy.behavior.impl;

          import com.sterning.ch1_strategy.behavior.FlyBehavior;

          public class FlyRocketPowered implements FlyBehavior {

              
          public void fly() {
                  System.out.println(
          "I'm flying with a rocket!");
              }


          }


           

          FlyWithWings.java

          package com.sterning.ch1_strategy.behavior.impl;

          import com.sterning.ch1_strategy.behavior.FlyBehavior;

          public class FlyWithWings implements FlyBehavior {

              
          public void fly() {
                  System.out.println(
          "I am flying!");
              }


          }


           

          MuteQuack.java

          package com.sterning.ch1_strategy.behavior.impl;

          import com.sterning.ch1_strategy.behavior.QuackBehavior;

          public class MuteQuack implements QuackBehavior {

              
          public void quack() {
                  System.out.println(
          "Silence");
              }


          }


           

          Quack.java

          package com.sterning.ch1_strategy.behavior.impl;

          import com.sterning.ch1_strategy.behavior.QuackBehavior;


          public class Quack implements QuackBehavior {

              
          public void quack() {
                  System.out.println(
          "Quack");
              }


          }


           

          Squeak.java

          package com.sterning.ch1_strategy.behavior.impl;

          import com.sterning.ch1_strategy.behavior.QuackBehavior;

          public class Squeak implements QuackBehavior {

              
          public void quack() {
                  System.out.println(
          "Squeak");
              }


          }


           

          3.實現類

          MallardDuck.java

          package com.sterning.ch1_strategy;

          import com.sterning.ch1_strategy.behavior.impl.FlyWithWings;
          import com.sterning.ch1_strategy.behavior.impl.Quack;

          public class MallardDuck extends Duck {
              
              
          public MallardDuck(){
                  quackBehavior
          =new Quack();
                  flyBehavior
          =new FlyWithWings();
              }

              
              @Override
              
          public void display() {
                  System.out.println(
          "I'm a real Mallard Duck");
              }


          }

           

          ModelDuck.java

          package com.sterning.ch1_strategy;

          import com.sterning.ch1_strategy.behavior.impl.FlyNoWay;
          import com.sterning.ch1_strategy.behavior.impl.Quack;


          public class ModelDuck extends Duck {
              
              
          public ModelDuck(){
                  flyBehavior
          =new FlyNoWay();
                  quackBehavior
          =new Quack();
              }

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


          }

           

          4.測試類

          MiniDuckSimulator.java

          package com.sterning.ch1_strategy.test;

          import com.sterning.ch1_strategy.Duck;
          import com.sterning.ch1_strategy.MallardDuck;
          import com.sterning.ch1_strategy.behavior.impl.FlyRocketPowered;

          public class MiniDuckSimulator {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  Duck mallard
          =new MallardDuck();
                  mallard.performFly();
                  mallard.performQuack();
                  
                  mallard.setFlyBehavior(
          new FlyRocketPowered());
                  mallard.performFly();
                  
              }


          }


          源代碼下載:DesignPattern_ch1_strategy.rar

          評論

          # re: 【Head First設計模式】-Strategy模式  回復  更多評論   

          2008-01-15 12:11 by fantasybei
          不錯,也正在看這本書,呵呵,有空交流下

          # re: 【Head First設計模式】-Strategy模式  回復  更多評論   

          2008-07-01 16:42 by Raul Gong
          這本書不錯,我正準備到網上買一本。
          這段時間看設計模式,看的《敏捷開發,原則,模式,與實踐》,寫得挺好,也是獲jolt大獎的,但里面的例子大量使用c++,讓我這個搞java的看起來有點頭痛,所以希望head first不要辜負我的期望了。
          主站蜘蛛池模板: 青海省| 米林县| 高安市| 牡丹江市| 亳州市| 甘孜| 盐边县| 双牌县| 隆尧县| 左云县| 大余县| 屏东县| 白城市| 罗江县| 兴海县| 贵德县| 张家川| 灯塔市| 耿马| 临武县| 茶陵县| 宁海县| 建平县| 邻水| 西盟| 东莞市| 朝阳区| 义马市| 靖宇县| 离岛区| 长泰县| 苍梧县| 玛曲县| 太原市| 富裕县| 上饶市| 柘荣县| 将乐县| 荆门市| 柳州市| 新郑市|