knot

导航

设计模式一之策略模式

开始研究设计模式,会将自己的理解以简单易懂的方式写出来,本系列内容持续更新.
我们一步一步来通过代码形式讲解策略模式。
设计模式之策略模式(以Duck鸭子来讲解):

这是整个项目的项目结构。我们知道,生活中有各种各样的鸭子,会游泳,会叫,有的是绿头鸭有的是红头鸭,木头鸭不会飞不会叫,玩具鸭会叫不会飞等等。

现在我们要写一个针对于所有鸭子都能用的代码,重点在于实现代码的复用,方便后期维护。

1. 写两个接口 FlyBehavior 和 QuackBehavoir.

(1)FlyBehavior中有一个fly()方法,主要负责鸭子飞的动作,在implem包中有针对于fly()的不同实现类,包括 FlyNoWay(不能飞) 和 FlyWithWIngs(可以飞).

(2)QuackBehavoir中有一个Quack()方法,主要负责鸭子叫的动作,在implem包中有针对于Quack的不同实现类,包括 moteQuack(mote叫) 和 Squack(quack叫).

2. 在Duck基类中,所包含的内容如下:

(1) swim是所有鸭子都有的行为,所以将swim的实现放在父类Duck中

(2) display()方法是鸭子都有的行为,但是实现方式不同,所以定义成abstract抽象类型,子类各自分别实现

(3) 定义两个接口,分别为 FlyBehavoir 和 QuackBehavoir

(4) 在PerformFly() 和 PerformQuack()方法中,通过接口调用接口中的行为方法

3. MiniDuck 是具体的鸭子对象

继承父类Duck,并实现父类中的抽象方法,在构造器中利用父类声明的接口调用具体的实现类。

4. testDuck是测试类

在测试类中new具体的鸭子对象,调用鸭子对象中已经实现的方法做测试。

 

5. 关于动态改变鸭子的行为(将原本不会飞的鸭子,加上一个rocket,让它具有飞的行为)

(1) 加入 FlyWithRocket 类,实现 FlyBehavoir 接口。

(2) 在父类中加入Set方法

(3) 在测试类中调用具体鸭子对象,调用Set方法直接改变鸭子行为即可

这样就可以动态改变鸭子的行为啦!

关于策略模式,旨在告诉我们,多用组合,少用继承。将行为分别封装成类,对象只需要将不同的行为类组合起来用即可实现。

 

从大局的角度来分析:

 

 


posted on 2018-01-05 11:57  knot  阅读(280)  评论(0编辑  收藏  举报