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

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

            

          一、從訂餐開(kāi)始

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

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

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

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

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

           

          二、Strategy模式

           

          1、兩大原則

           

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

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

          l         多用組合,少用繼承。

           

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


           

           

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


           

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

           

          1.抽象類(lèi)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.行為封裝類(lèi)

           

          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)類(lèi)

          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.測(cè)試類(lèi)

          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

          評(píng)論

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

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

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

          2008-07-01 16:42 by Raul Gong
          這本書(shū)不錯(cuò),我正準(zhǔn)備到網(wǎng)上買(mǎi)一本。
          這段時(shí)間看設(shè)計(jì)模式,看的《敏捷開(kāi)發(fā),原則,模式,與實(shí)踐》,寫(xiě)得挺好,也是獲jolt大獎(jiǎng)的,但里面的例子大量使用c++,讓我這個(gè)搞java的看起來(lái)有點(diǎn)頭痛,所以希望head first不要辜負(fù)我的期望了。
          主站蜘蛛池模板: 彭水| 漠河县| 张北县| 嘉义市| 宜川县| 什邡市| 文登市| 宝坻区| 永泰县| 秭归县| 工布江达县| 石门县| 毕节市| 和田县| 林甸县| 封开县| 富顺县| 桃园市| 桐梓县| 应城市| 霍林郭勒市| 铜梁县| 禹城市| 秀山| 英山县| 平遥县| 临沧市| 平顶山市| 于都县| 双柏县| 尚志市| 康马县| 石城县| 华容县| 木里| 马公市| 武川县| 额济纳旗| 民县| 宁化县| 滕州市|