Duck示例策略模式 - 头部设计模式

Kak*_*shi 7 php java design-patterns

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

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

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

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

但在结论中他补充说performFly(),有performQuack();什么不同,因为我觉得它一样he was also adding behavior that was not appropiate for sume Duck subclasses

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

Ant*_*ano 6

我不是设计模式的专家,但是当我阅读那本书时,我对那一章的第一感觉是接口的构建和实现方式违反了一个众所周知的编程原则:接口隔离原则 (ISP) 基本上这个原则表明

不应强迫客户端依赖它不使用的方法

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


Per*_*ges 5

当您偏向于继承而不是继承 时,策略模式就可以使用http://en.wikipedia.org/wiki/Composition_over_inheritance

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

该示例中的操作是在父类中定义“行为”。在父类中,您定义鸭子可以具有飞行行为和嘎嘎行为。但这并不意味着儿童班必须要有嘎嘎声或飞行。

你可以有一只不飞的鸭子,当你叫“飞”时,它什么也不会做,因为我们会有“不飞”的行为。

除了可以硬编码鸭子在类中的工作方式,您还可以随时更改它的行为。


Fly*_*ter 2

最后,他添加了两个具有fly()功能的新类。然而,功能并不总是能让鸭子飞起来。橡皮鸭不会飞,因此它们使用该类的一个实例FlyNoWay。其他可以飞的鸭子使用该类的实例FlyWithWingsflyBehavior类中的字段Duck可能会在构造函数中设置。

该函数performFly()将调用fly()所选类的函数。

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

  • 但橡皮鸭仍然继承了“飞”,“橡皮鸭”不需要它? (3认同)