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