Java 策略模式 (Strategy Pattern),strategypattern

來源:互聯網
上載者:User

Java 策略模式 (Strategy Pattern),strategypattern

最近在看 《Head First 設計模式 》,很好的一本書。通俗易懂。

策略模式

定義了演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。

代碼:

package gx.customer;import gx.behavior.FlyBehavior;import gx.behavior.QuackBehavior;/** *  * Duck 類是所有鴨子的超類,但飛行行為和呱呱叫行為已經被提取(變化的行為) * @author always * */public abstract class Duck {    protected FlyBehavior flyBehavior;    protected QuackBehavior quackBehavior;    public void swim(){        System.out.println("是鴨子都回遊泳,這個不算什麼");    }    public void performFly(){        if(flyBehavior!=null){            flyBehavior.fly();        }else{            System.out.println("沒有飛行行為");        }    }    public void performQuack(){        if(quackBehavior!=null){            quackBehavior.quack();        }else{            System.out.println("沒有叫行為");        }       }    public void setFlyBehavior(FlyBehavior flyBehavior) {        this.flyBehavior = flyBehavior;    }    public void setQuackBehavior(QuackBehavior quackBehavior) {        this.quackBehavior = quackBehavior;    }    public abstract void display();}
package gx.behavior;/** * 飛行行為的介面 * @author always * */public interface FlyBehavior {    void fly();}
package gx.behavior;/** * 呱呱叫行為的介面 * @author always * */public interface QuackBehavior {    void quack();}

行為的實現:演算法族

package gx.behavior.impl;import gx.behavior.FlyBehavior;public class FlyNoWay implements FlyBehavior{    public void fly() {        System.out.println("已經開始學了,還是沒有學會啊。好難額");    }}
package gx.behavior.impl;import gx.behavior.FlyBehavior;public class FlyWithWings implements FlyBehavior{    public void fly() {        System.out.println("用翅膀,用力的飛");    }}
package gx.behavior.impl;import gx.behavior.QuackBehavior;public class MuteQuack implements QuackBehavior {    public void quack() {        System.out.println("不會叫");    }}
package gx.behavior.impl;import gx.behavior.QuackBehavior;public class Quack implements QuackBehavior{    public void quack() {        System.out.println("呱呱叫");    }}
package gx.behavior.impl;import gx.behavior.QuackBehavior;public class Squack implements QuackBehavior {    public void quack() {        System.out.println("吱吱叫");    }}
package gx.customer;import gx.behavior.impl.FlyWithWings;import gx.behavior.impl.Quack;public class MallardDuck extends Duck{    public MallardDuck(){        flyBehavior=new FlyWithWings();        quackBehavior=new Quack();    }    public void display() {        System.out.println("看起來像綠頭鴨");    }}

客戶使用封裝好的飛行和呱呱叫演算法族

package gx.customer;import gx.behavior.impl.FlyNoWay;import gx.behavior.impl.MuteQuack;public class RedheadDuck extends Duck{    public RedheadDuck(){        flyBehavior=new FlyNoWay();        quackBehavior=new MuteQuack();    }    @Override    public void display() {        System.out.println("紅頭雞");    }}

測試類別:

package gx.test;import org.junit.Test;import gx.behavior.impl.FlyWithWings;import gx.customer.Duck;import gx.customer.MallardDuck;import gx.customer.RedheadDuck;public class TestStrategy {    private Duck duck;    @Test    public void testMallardDuck(){        duck=new MallardDuck();        duck.display();        duck.performFly();        duck.performQuack();        /*        結果:        看起來像綠頭鴨        用翅膀,用力的飛        呱呱叫        */    }    @Test    public void testRedheadDuck(){        duck=new RedheadDuck();        duck.display();        duck.performFly();        duck.performQuack();        duck.setFlyBehavior(new FlyWithWings());//動態調用新的“演算法”        duck.performFly();        /*        結果:        紅頭雞        已經開始學了,還是沒有學會啊。好難額        不會叫        用翅膀,用力的飛        */    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.