java - 策略模式的鸭子示例

标签 java design-patterns inheritance

<分区>

我正在阅读 java 中的策略设计模式。问题设置如下

你有一个鸭子类和几种鸭子。您必须对鸭子的飞行和嘎嘎行为进行编码。你显然不能在每个鸭子类方法中编写飞行和非飞行行为的代码,尤其是当你有 100 种不同的鸭子时。因此,您创建了一个名为 FlyingBehaviorQuackingBehavior 的行为接口(interface),并具有类似 NonFlyingBehaviorFlyWithWingsBehaviorMuteQuackBehavior 的实现SqueakQuackBehavior。然后将这些设置在不同类别的鸭子的字段中。这样你就可以将这些行为与鸭子联系起来。

我不明白的是为什么它必须用组合来完成,为什么不能用继承来完成。为什么不能创建子类 lke NonFlyingDuck, FlyWithWingsDuck 或者 SqueakingDuck, MuteQuackingDuck 等等,然后实现fly()quack() 方法,然后将适当的行为分配给鸭子。是不是因为不支持多重继承。所以如果你有一只不会飞的吱吱叫的鸭子,那么你不能同时扩展 squeakingDuckNonFlyingDuck 或者它是别的东西。有什么方法可以通过继承来做到这一点吗?

感觉有点乱。座右铭是“重组合胜过继承”。为什么呢?

谁能详细解释一下?

最佳答案

我不知道深入的解释,但为什么在这种情况下不使用继承很容易。因为Java不支持多重继承。
想象一下,在创建了 4 个类(NonFlyingDuck、FlyWithWingsDuck 或 SqueakingDuck、MuteQuackingDuck)之后,您需要添加另一个行为吗? (就像我不知道,CodingDuck)。那么你将以 8 个类结束,每个 CodingDuckBehavior 有 2 个类(有些鸭子知道怎么做,有些则不知道)。但为什么要停在这里?您可能对每个行为都有多个实现,这使得继承变得不切实际。
如果你能 Handlebars 放在Head First Design Patterns ,我发现他们的策略模式示例经过深思熟虑(它为您提供了继承路径上可能出错的示例)。

关于java - 策略模式的鸭子示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816843/

相关文章:

java - I/O错误:没有路由到主机;嵌套的异常是java.net.NoRouteToHostException:没有路由到主机

java - 如何在 Java Swing 中从 MS Access 数据库动态获取数据?

java - 使用 RxJava 获取插入 id (Room)

java - 在基于 GWT 的应用程序中添加访问控制

java - 在开始 Android 开发之前我应该​​学习哪些设计模式

java - 将java函数注册为C函数中的回调

c# - DAL和BO层Singleton的正确使用?

c# - 如何在 C# 中创建类列表以在循环中迭代

父类中的Scala继承默认参数

javascript - 如何在 Google Closure 中使用 var_args 调用父类的构造函数?