设计模式-策略模式

来源:互联网 发布:java有哪些设计模式 编辑:程序博客网 时间:2024/04/29 20:08
  1. public abstract class Duck {
  2.     FlyBehavior flyBehavior;
  3.     QuackBehavior quackBehavior;
  4.     public Duck() {
  5.     }
  6.     public void setFlyBehavior (FlyBehavior fb) {
  7.         flyBehavior = fb;
  8.     }
  9.     public void setQuackBehavior(QuackBehavior qb) {
  10.         quackBehavior = qb;
  11.     }
  12.     abstract void display();
  13.     public void performFly() {
  14.         flyBehavior.fly();
  15.     }
  16.     public void performQuack() {
  17.         quackBehavior.quack();
  18.     }
  19.     public void swim() {
  20.         System.out.println("All ducks float, even decoys!");
  21.     }
  22. }
  1. public interface FlyBehavior {
  2.     public void fly();
  3. }

 

  1. public interface QuackBehavior {
  2.     public void quack();
  3. }

 

  1. public class FlyWithWings implements FlyBehavior {
  2.     public void fly() {
  3.         System.out.println("I'm flying!!");
  4.     }
  5. }

 

  1. public class RedHeadDuck extends Duck {
  2.     public RedHeadDuck() {
  3.         flyBehavior = new FlyWithWings();//子类中改变实现,且互不影响。
  4.         quackBehavior = new Quack();
  5.     }
  6.     public void display() {
  7.         System.out.println("I'm a real Red Headed duck");
  8.     }
  9. }

测试代码如下:

  RedHeadDuck redHeadDuck = new RedHeadDuck();
  
  redHeadDuck.performFly();
  redHeadDuck.display();

 

输出结果:

I'm flying!!
I'm a real Red Headed duck

 

下面我们可以实现其他飞的方式,例如乘火箭

  1. public class FlyRocketPowered implements FlyBehavior {
  2.     public void fly() {
  3.         System.out.println("I'm flying with a rocket");
  4.     }
  5. }

测试代码:  

RedHeadDuck redHeadDuck = new RedHeadDuck();
  redHeadDuck.setFlyBehavior(new FlyRocketPowered());
  redHeadDuck.display();
  redHeadDuck.performFly();

输出结果:

I'm a real Red Headed duck
I'm flying with a rocket

 

小结:

可见策略模式定义了算法,将他们分别封装,他们之间可以相互替换。(例如:FlyWithWings和FlyRocketPowered)

这样每个实现都相互不影响。