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

          日歷

          <2008年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 1382899
          • 排名 - 18

          最新評論

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

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

          Head First設計模式】-Strategy模式

            

          一、從訂餐開始

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

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

          小劉:一個黑與白。

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

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

           

          二、Strategy模式

           

          1、兩大原則

           

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

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

          l         多用組合,少用繼承。

           

          2.傳統(tǒng)設計


           

           

          3.strategy設計


           

          三、代碼實現(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)實現(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.實現(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設計模式】-Strategy模式  回復  更多評論   

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

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

          2008-07-01 16:42 by Raul Gong
          這本書不錯,我正準備到網(wǎng)上買一本。
          這段時間看設計模式,看的《敏捷開發(fā),原則,模式,與實踐》,寫得挺好,也是獲jolt大獎的,但里面的例子大量使用c++,讓我這個搞java的看起來有點頭痛,所以希望head first不要辜負我的期望了。
          主站蜘蛛池模板: 城步| 洛川县| 岱山县| 芜湖市| 和林格尔县| 伊春市| 陆良县| 新巴尔虎右旗| 平江县| 富顺县| 宕昌县| 长宁区| 和顺县| 邹平县| 宝山区| 沛县| 云林县| 右玉县| 贵定县| 庆云县| 东光县| 四川省| 县级市| 南乐县| 吴桥县| 攀枝花市| 平阳县| 山阳县| 丽水市| 蒲江县| 临潭县| 讷河市| 望城县| 庄浪县| 手机| 城步| 尚志市| 英德市| 石首市| 蒙山县| 新营市|