深入浅出设计模式----Welcome to Design Patterns

来源:互联网 发布:java base64源码 编辑:程序博客网 时间:2024/05/23 01:24

        设计一个鸭子池塘模拟游戏,叫做SimuDuck。这个游戏可以有各种会游泳(swim)和鸣叫(quack)的鸭子物种。刚开始这个游戏的设计是使用标准的OO技术,设计了一个Duck父类,并且每个Duck子类都继承该父类。 

        但是后来要求有些鸭子有fly的功能

        首先想在父类里面添加fly的方法,然后每个子类继承,但是发现并非所有的鸭子都需要fly的功能。在不需要fly的鸭子里面也需要重写该方法,只是该方法不做任何事情,这些代码成了冗余无用的代码。而且当有更多的鸭子既不需要quack,又不许要fly时,也要在每个子类里重写2个甚至更多的方法。继承未必是解决该问题的好方法。

        考虑用接口。将fly抽象为接口,quack也抽象为接口,能fly的鸭子就实现fly这个接口,能quack的就实现quack接口。这样就不会导致不需要这2个功能的,却也要重写功能代码。但是这未必是个好主意。很多鸭子的fly和quack的代码一样,但是每个实现了fly和quack的鸭子都得重复写同样的代码。最糟糕的是,当你为每个duck copy好所有的fly和quack代码,发现要修改下fly的代码,却每个都要修改,简直就是个噩梦,根本达不到代码重用的目的。

Design Principle: Identity the aspects of your application that vary and separate them from what stays the same.

将那些变化的部分从相对不变的部分中抽取出来,以后我们改变或者修改那些变化的部分时将不会影响到不变的部分。

将duck中变化的fly和quack抽取出来。

Design Principle: Program to an interface, not an implementation.

定义fly和quack的接口,然后每个具体的fly和quack实现这个接口。然后在每个duck内部维护一个fly接口和quack接口的对象。

策略模式

原创粉丝点击