策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
类图
(图片源于网络)
代码实现(Java)
//Duck.java public abstract class Duck { public FlyBehavior flyBehavior; public QuackBehavior quackBehavior; public Duck() {} public void swim() { System.out.println("All ducks float, even decoys!"); } public abstract void display(); public void performQuack() { quackBehavior.quack(); } public void performFly() { flyBehavior.fly(); } public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } }
//FlyBehavior.java public interface FlyBehavior { public void fly(); }
//FlyWithWings.java public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println("I’m flying!!"); } }
//FlyNoWay.java public class FlyNoWay implements FlyBehavior { public void fly() { System.out.println("I can’t fly"); } }
//QuackBehavior.java public interface QuackBehavior { public void quack(); }
//Quack.java public class Quack implements QuackBehavior { public void quack() { System.out.println("Quack"); } }
//Sqeak.java public class Squeak implements QuackBehavior { public void quack() { System.out.println("Squeak"); } }
//MuteQuack.java public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("<< Silence >>"); } }
//ModelDuck.java public class ModelDuck extends Duck { public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display() { System.out.println("I’m a model duck"); } }
测试代码
//ModelDuckSimulator.java public class ModelDuckSimulator{ public static void main(String args[]){ Duck modelDuck = new ModelDuck(); modelDuck.performFly(); modelDuck.performQuack(); } }
运行结果