《Head First设计模式》之策略模式

 现在如果我们要让鸭子会飞,那么只需要在超类上添加方法即可:

《Head First设计模式》之策略模式


这时候就出现了一个bug!  如果子类是塑料鸭或者残疾的鸭子,那岂不是也到处乱飞!!!

这是个严重的问题。所以在这时候又想到了用“继承”来解决 。

《Head First设计模式》之策略模式

继承又会导致,如果出现诱饵鸭、橡皮鸭。总不能每次都去覆盖父类的方法吧。拓展性极差。

所以决定改用接口来解决此问题,将fly和quack两个行为从父类抽离出来,放到接口中,这样让会飞会叫的鸭子去实现该接口,而对于诱饵鸭这种不会飞不会叫的鸭子则不去实现接口。

《Head First设计模式》之策略模式


虽然Flyable和Quanckable接口可以解决部分问题,但是却造成代码难以复用。所有具备飞行和吱吱叫的鸭子都需要实现一遍接口,只能说是从一个噩梦进到另一个噩梦。这时候就要依赖涉设计模式了。

《Head First设计模式》之策略模式

《Head First设计模式》之策略模式


再来一个设计原则:

《Head First设计模式》之策略模式

《Head First设计模式》之策略模式


其实此时使用接口方案并非最优,对于鸭子的飞行和吱吱叫行为使用抽象超类,这样就可以使用多态实现了。

《Head First设计模式》之策略模式


《Head First设计模式》之策略模式

《Head First设计模式》之策略模式


那现在就让我们继续实现鸭子的行为吧!

《Head First设计模式》之策略模式




---- 现在整合一下Duck超类。

《Head First设计模式》之策略模式


每当要新出一个鸭子模型,就可以这样实现。

《Head First设计模式》之策略模式


此时我们又会发现新的问题出现了。在构造方法定义出具体的飞行实现和吱吱叫的实现。与之前所说的“不对具体实现编程”背道而驰了。下面的改造可以帮我们解决这一问题。顺便我们可以把对鸭子的设计整体做一个测试了。


《Head First设计模式》之策略模式


《Head First设计模式》之策略模式

《Head First设计模式》之策略模式


这样的设计就是我们目前所期望的了。鸭子extends 类Duck;飞行行为实现FlyBehavior接口,呱呱叫实现  QuackBehavior接口。


《Head First设计模式》之策略模式

《Head First设计模式》之策略模式

《Head First设计模式》之策略模式



总结一哈:

《Head First设计模式》之策略模式





相关文章: