<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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ù)我的期望了。
    主站蜘蛛池模板: 亚洲国产精品一区| 亚洲中文无码a∨在线观看| 亚洲国产精品日韩在线观看| 亚洲日韩国产二区无码 | 亚洲 欧洲 日韩 综合在线| 野花视频在线官网免费1| 全免费a级毛片免费看| 香蕉视频在线观看免费国产婷婷| 亚洲中文字幕无码久久精品1| 国产成人精品亚洲日本在线 | 一二三四在线观看免费中文在线观看| 午夜精品一区二区三区免费视频 | 亚洲av无码一区二区乱子伦as| 亚洲色偷偷色噜噜狠狠99网| 免费看黄的成人APP| 暖暖日本免费在线视频| 亚洲毛片在线观看| 理论秋霞在线看免费| 五月亭亭免费高清在线| 中文字幕亚洲图片| 亚洲国产成人久久一区二区三区| 国产99视频精品免费专区| 免费国产成人高清视频网站| 亚洲最大视频网站| a级毛片毛片免费观看永久| 日本免费高清一本视频| 久久精品国产亚洲精品2020| 免费无码AV一区二区| 最近最好的中文字幕2019免费 | 中文字幕不卡免费视频| 精品剧情v国产在免费线观看| 久久亚洲美女精品国产精品| 一级毛片a免费播放王色| 热久久精品免费视频| 亚洲福利秒拍一区二区| 最近中文字幕大全免费版在线| 亚洲欧洲久久av| 亚洲AV噜噜一区二区三区| 成年网站免费视频A在线双飞| 亚洲精品高清久久| 中文在线观看国语高清免费|