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

          【Head First設(shè)計(jì)模式】-Strategy模式

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

          Head First設(shè)計(jì)模式】-Strategy模式

            

          一、從訂餐開始

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

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

          小劉:一個(gè)黑與白。

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

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

           

          二、Strategy模式

           

          1、兩大原則

           

          設(shè)計(jì)模式真正體現(xiàn)的是Java的原則,而這些原則又通過這些優(yōu)秀的模式反映出來。有些面向?qū)ο蟮脑瓌t,適用于所有的模式,當(dāng)無法找到適當(dāng)?shù)哪J浇鉀Q問題時(shí),這些原則就是唯一的標(biāo)準(zhǔn)了。Strategy模式體現(xiàn)了如下的兩大原則:

          l         針對接口編程,而不是針對實(shí)現(xiàn)編程。

          l         多用組合,少用繼承。

           

          2.傳統(tǒng)設(shè)計(jì)


           

           

          3.strategy設(shè)計(jì)


           

          三、代碼實(shí)現(xiàn)

           

          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)實(shí)現(xiàn)

           

          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.實(shí)現(xiàn)類

          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設(shè)計(jì)模式】-Strategy模式  回復(fù)  更多評論   

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

          # re: 【Head First設(shè)計(jì)模式】-Strategy模式  回復(fù)  更多評論   

          2008-07-01 16:42 by Raul Gong
          這本書不錯(cuò),我正準(zhǔn)備到網(wǎng)上買一本。
          這段時(shí)間看設(shè)計(jì)模式,看的《敏捷開發(fā),原則,模式,與實(shí)踐》,寫得挺好,也是獲jolt大獎(jiǎng)的,但里面的例子大量使用c++,讓我這個(gè)搞java的看起來有點(diǎn)頭痛,所以希望head first不要辜負(fù)我的期望了。
          主站蜘蛛池模板: 金门县| 姚安县| 邵阳市| 莫力| 八宿县| 肃北| 沅江市| 抚顺县| 于田县| 阳新县| 宁远县| 肃北| 尼木县| 余江县| 宜都市| 清镇市| 滦南县| 阿坝| 东兰县| 古浪县| 剑阁县| 连城县| 扎兰屯市| 陇川县| 阜南县| 夏河县| 临武县| 奈曼旗| 保山市| 慈溪市| 民乐县| 五大连池市| 扶沟县| 天气| 丰城市| 镇康县| 高清| 苏尼特左旗| 新乐市| 洪洞县| 塘沽区|