策略模式定義了算法族,分別封裝起來,讓它們之間能夠相互替換,此模式讓算法的變化獨立於使用算法的客戶。算法
要點:ide
/** * 策略接口 */ public interface Strategy { /** * 執行策略行爲 */ public void perform(); }
/** * 策略實現類A */ public class StrategyImplA implements Strategy { /** * A策略行爲 */ @Override public void perform() { System.out.println("perform A..."); } }
/** * 策略實現類B */ public class StrategyImplB implements Strategy { /** * B策略行爲 */ @Override public void perform() { System.out.println("perform B..."); } }
/** * 策略使用者 */ public class StrategyUser { /** * 聲明接口類型的策略變量 */ private Strategy strategy; /** * 經過構造實例化策略 */ public StrategyUser(Strategy strategy) { this.strategy = strategy; } /** * 執行策略使用者的行爲 */ public void doBehavior() { // do something... // 使用策略 strategy.perform(); // do something... } }
public class Test { public static void main(String[] args) { // 使用策略A StrategyUser userA = new StrategyUser(new StrategyImplA()); userA.doBehavior(); // 使用策略B StrategyUser userB = new StrategyUser(new StrategyImplB()); userB.doBehavior(); } }
Joe 上班的公司作了一套至關成功的模擬鴨子游戲:SimUDuck。遊戲中會出現各類鴨子,鴨子的種類及屬性以下:測試
不一樣種類的鴨子所對應的屬性以下:this
/** * 飛行行爲接口 */ public interface FlyBehavior { public void fly(); }
/** * 呱呱叫行爲接口 */ public interface QuackBehavior { public void quark(); }
/** * 用翅膀飛行 */ public class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("I'm flying!"); } } /** * 不會飛行 */ public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("I can't flying!"); } }
/** * 呱呱叫 */ public class Quack implements QuackBehavior { @Override public void quark() { System.out.println("Quack"); } } /** * 吱吱叫 */ public class Squeak implements QuackBehavior { @Override public void quark() { System.out.println("Squeak"); } } /** * 不會叫 */ public class MuteQuack implements QuackBehavior { @Override public void quark() { System.out.println("<<Silence>>"); } }
/** * 鴨子抽象類 */ public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } /** * 外觀 */ public abstract void display(); /** * 游泳行爲 */ public void swim() { System.out.println("All ducks float, even decoys!"); } /** * 飛行行爲 */ public void performFly() { flyBehavior.fly(); } /** * 呱呱叫行爲 */ public void performQuark() { quackBehavior.quark(); } }
/** * 綠頭鴨 */ public class MallardDuck extends Duck { public MallardDuck() { // 指定具體的飛行行爲 flyBehavior = new FlyWithWings(); // 指定具體的呱呱叫行爲 quackBehavior = new Quack(); } @Override public void display() { System.out.println("I'm a real Mallard duck"); } } /** * 紅頭鴨 */ public class RedHeadDuck extends Duck { public RedHeadDuck() { // 指定具體的飛行行爲 flyBehavior = new FlyWithWings(); // 指定具體的呱呱叫行爲 quackBehavior = new Quack(); } @Override public void display() { System.out.println("I'm a red head duck"); } } /** * 橡皮鴨 */ public class RubberDuck extends Duck { public RubberDuck() { // 指定具體的飛行行爲 flyBehavior = new FlyNoWay(); // 指定具體的呱呱叫行爲 quackBehavior = new Squeak(); } @Override public void display() { System.out.println("I'm a rubber duck"); } } /** * 誘餌鴨 */ public class DecoyDuck extends Duck { public DecoyDuck() { // 指定具體的飛行行爲 flyBehavior = new FlyNoWay(); // 指定具體的呱呱叫行爲 quackBehavior = new MuteQuack(); } @Override public void display() { System.out.println("I'm a decoy duck"); } }
public class Test { public static void main(String[] args) { // 綠頭鴨 MallardDuck mallardDuck = new MallardDuck(); mallardDuck.performFly(); mallardDuck.performQuark(); // 紅頭鴨 RedHeadDuck redHeadDuck = new RedHeadDuck(); redHeadDuck.performFly(); redHeadDuck.performQuark(); // 橡皮鴨 RubberDuck rubberDuck = new RubberDuck(); rubberDuck.performFly(); rubberDuck.performQuark(); // 誘餌鴨 DecoyDuck decoyDuck = new DecoyDuck(); decoyDuck.performFly(); decoyDuck.performQuark(); } }