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(); /* 結果: 紅頭雞 已經開始學了,還是沒有學會啊。好難額 不會叫 用翅膀,用力的飛 */ }}