鸭示例策略模式 – 头首设计模式

我想问一下这本书上的鸭子例子让我感到困惑,我感到矛盾。

  1. 问题 在此处输入图像描述

  2. 结论 在此处输入图像描述

他说“ 当乔给鸭子超级类增加了新的行为时,他还添加了对于sume Duck子类不合适的行为

但在结论中他添加了performFly()performQuack(); 有什么不同,因为我认为同样he was also adding behavior that was not appropiate for sume Duck subclasses

**图片摘自头脑第一设计图案**这个问题没有说明这本书不好,这本书在我看来真的很好。 这只是我在问一些我从书中得不到的东西。

在结论中,他正在添加两个具有fly()函数的新类。 但是,该function并不总是让鸭子飞起来。 橡皮鸭不能飞,因此他们使用FlyNoWay类的实例。 其他可以飞行的鸭子使用FlyWithWings类的实例。 Duck类中的字段flyBehavior可能会在构造函数中设置。

函数performFly()会调用fly()函数来选择任何类。

正如kainaw在评论中所说,这是一个相当复杂的解决方案。 但是,它仍然可以使用。 假设你正在创建一个鸭子设计程序。 如果用户选择鸭子是否可以飞行,则不能进行硬编码。 您可以创建一个布尔值,但您可能需要处理更复杂的情况,如行为。 您可能需要WildDuckBehavior类和DomesticDuckBehavior ,每个类都有自己的行为信息。 基本上,本书中的示例是如何使用它的简化版本。

当你喜欢构图而不是inheritance时,策略模式有效http://en.wikipedia.org/wiki/Composition_over_inheritance

这是一个很好的做法,因为您可以更改类的行为而无需更改任何代码。 而且你也不需要一个庞大的类树。 您还可以动态更改类的行为。

它在示例中的作用是在父类中定义“行为”。 在父类中,您定义Duck可以具有飞行行为和嘎嘎行为。 但这并不意味着孩子们必须得到庸医或飞行。

你可以拥有一只非飞鸭,当你打电话给“飞”时,它什么也不会做,因为我们会有“不飞行”的行为。

您可以随时更改此鸭子的行为,而不是硬编码鸭子在课堂上的作用。

我不是设计模式的大师,但在我阅读那本书时,我对该特定章节的第一感觉是接口的构建和实现方式,违反了一个众所周知的编程原则: 接口隔离原理(ISP)基本上这个原则说明了这一点

任何客户都不应该被迫依赖它不使用的方法

因为一些不飞的鸭子实施了fly()方法,即便它们也不需要它。 也就是说,我认为在这种特殊情况下,实现所有接口方法是不可避免的,因为在客户端我们正在使用多态行为,我们需要确保即使未使用也可以使用所有方法。