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


类图

设计模式——策略模式(Strategy Pattern)_设计模式

(图片源于网络)


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


运行结果

设计模式——策略模式(Strategy Pattern)_设计模式_02