设计模式之策略模式

来源:互联网 发布:pc蛋蛋网站源码 编辑:程序博客网 时间:2024/06/05 16:50

先从简单的模拟鸭子应用做起,游戏中会出现各种鸭子,一边游戏饮水,一边呱呱叫。此系统内部设计使用了标准的OO技术,设计了一个鸭子超类,并让各种鸭子继承此超类。

模拟鸭子项目

public abstract class Duck {public void Quack() {System.out.println("gaga");}public abstract void display();public void swim() {System.out.println("im swiming");}}

1、GreenHeadDuck继承Duck :

publicclass GreenHeadDuck extends Duck {  @Override  public void display() {  System.out.println("GreenHead");  }}

2、同理有RedHeadDuck等

项目的新需求

1、应对新需求,看看这个设计的可拓展性

   a、添加会飞的鸭子

2、OO思维里的继承方式解决方案是:

public abstract class Duck {        ...;        public void Fly() {        System.out.println("im flying");    }    };
但是问题来了, 这个Fly()让所有鸭子(包括橡皮鸭子等)都会飞了,这是不科学的。
继承的问题:对超类的局部改动,会影响子类。

3、继续用OO原则来解决

public class RubberDuck extends Duck {...;public void Fly() {System.out.println("no fly");}}
超类挖的一个坑,每个子类都要来填,增加工作量,不是好的设计方式。

用策略模式来解决新需求

1、接口:

    1)public interface FlyBehavior    {    void fly();}            2)public interface QuackBehavior    {    void quack();}   好处:行为类更好的复用,组合更方便。有继承带来的复用好处,没有挖坑

2、行为类:

public class GoodFlyBehavior implements FlyBehavior{        @Overridepublic void fly() {System.out.println("im flying");}}public class NoFlyBehavior implements FlyBehavior{    @Override    public void fly() {         System.out.println("NoFly");    }}public class GaGaQuackBehavior implements QuackBehavior{       @Override    public void quack() {       System.out.println("GaGa");    }}public class NoQuackBehavior implements QuackBehavior{       @Override    public void quack() {        System.out.println("NoQuack");    }}

3、重新设计的鸭子项目:
public abstract class Duck {FlyBehavior mFlyBehavior;QuackBehavior mQuackBehavior;  //为行为接口类型声明两个引用变量public Duck() {}public void Fly() {mFlyBehavior.fly();}public void Quack() {mQuackBehavior.quack();}public abstract void display();        public void swim(){                       System.out.println("im swiming");        }        public void SetQuackBehavoir(QuackBehavior qb) {        mQuackBehavior = qb;    }        public void SetFlyBehavoir(FlyBehavior fb) {     //动态设定行为        mFlyBehavior = fb;      }}

4、绿头鸭

public class GreenHeadDuck extends Duck {public GreenHeadDuck() {mFlyBehavior = new GoodFlyBehavior();mQuackBehavior = new GaGaQuackBehavior();}@Overridepublic void display() {...}}

策略模式总结

1、策略模式:定义算法族,分别封装起来,让它们之间可以相互替换,此模式让行为算法的变化独立于算法的使用者。

2、策略模式是一个较为容易理解和使用的设计模式,是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。使用者需要理解所有具体策略类之间的区别,以便选择合适的算法。总的原则:分离变化部分,封装接口,基于接口编程各种功能。




0 0
原创粉丝点击