Head First Design Patterns 读后感3-谋略模式

Head First Design Patterns 读后感3-策略模式
策略模式-定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。策略模式有点像调包计和偷梁换柱。
设计模式就是为了适应变化那些大师而想起来的,能适应变化的软件才能长命,人也一样,只有适应外界变化,方可生存。


package pattern;
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();
public void performFly() {
  flyBehavior.fly();
}
public void performQuack() {
  quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb) {
  flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
  quackBehavior = qb;
}
public void swim() {
  System.out.println("All ducks float,even decoys!");
}
}
interface FlyBehavior {
public void fly();
}
class FlyWithWings implements FlyBehavior {
public void fly() {
  System.out.println("I am flying!!");
}
}
class FlyNoWay implements FlyBehavior {
public void fly() {
  System.out.println("i can not flying !!");
}
}
class FlyRocketPowered implements FlyBehavior {
public void fly() {
  System.out.println("i am flying with a rocket!");
}
}
interface QuackBehavior {
public void quack();
}
class Quack implements QuackBehavior {
public void quack() {
  System.out.println("Quack");
}
}
class MuteQuack implements QuackBehavior {
public void quack() {
  System.out.println("<<>Silence>");
}
}
class Squeak implements QuackBehavior {
public void quack() {
  System.out.println("Squeak");
}
}
class MallardDuck extends Duck {
public MallardDuck() {
  quackBehavior = new Quack();
  flyBehavior = new FlyWithWings();
}
public void display() {
  System.out.println("i am a real Mallard duck");
}
}
class ModelDuck extends Duck {
public ModelDuck() {
  flyBehavior = new FlyNoWay();
  quackBehavior = new Quack();
}
public void display() {
  System.out.println("i am a model duck");
}
}
class MiniDuckSimulator {
public static void main(String[] args) {
  Duck mallard = new MallardDuck();
  mallard.performQuack();
  mallard.performFly();
  Duck model = new ModelDuck();
  model.performFly();
  model.performQuack();
  model.setFlyBehavior(new FlyWithWings());
  model.setQuackBehavior(new Squeak());
  model.performFly();
  model.performQuack();
}
}