策略模式定义了算法族,分别封装起来,让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户。算法
要点: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(); } }