策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

类图

(图片源于网络)

代码实现(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();        }}

运行结果