【问题标题】:Clarification required - Design Patterns需要澄清 - 设计模式
【发布时间】:2011-05-07 04:12:00
【问题描述】:

在大多数设计模式概念中,都提到了“Has A”优于“Is A”的意思。

在第一章 - Head First Design Patterns - “Intro to Design Patterns”,“Integrating the Duck Behaviour”部分(第 15 页),Duck 类引用了 FlyBehavior 和 QuackBehavior接口类型。例如,我们要为一种 Ducks 添加一个名为 XYZBehavior 的新行为(假设客户端尚未决定),我们需要更改 Duck 类以引用新接口。因此,我们需要更改类,但根据良好的设计模式,这不应该发生。

你能建议我如何处理这个要求吗?

【问题讨论】:

  • 很抱歉添加了来自 Head First Design Patterns 的示例...
  • 你能为我们这些没有那本书的人提供一个代码示例吗?

标签: java oop design-patterns inheritance aggregation


【解决方案1】:

这个问题可以通过Dependency Injection来解决

(在 Java 中通常通过 SpringGuice

这是Beginner's Guide to dependency Injection

基本上,鸟会有一个行为属性:

private Collection<Behavior> behaviors;
public void setBehaviors(Collection<Behavior> behaviors){
    this.behaviors = behaviors;
}

现在在配置文件中,您可以指定将哪些行为注入到 Bird 中,而无需更改 Bird 类。

【讨论】:

  • 很好的例子。非常感谢
【解决方案2】:

如果您添加行为(策略),策略模式不会阻止更改类。如果现有行为(策略)发生变化,它只是防止接触班级。

以 QuackBehaviour 为例:假设,我们认为鸭子听起来像“quaaack”,但经过几年的研究我们意识到,鸭子实际上听起来像“quaaack”。我们很幸运,我们实现了 QuackBehaviour 并且只是为普通鸭子调整了 QuackBehaviour 接口的实现。这就是这种模式的诀窍。

如果稍后我们决定添加 SwimBehaviour,因为另一个研究团队意识到游泳是鸭子的常见行为,那么我们必须触摸鸭子并添加该行为(添加到 Duck 类中)。

希望对您有所帮助!

【讨论】:

  • 很好的解释。非常感谢。
【解决方案3】:

您可以使用Composition 处理这种情况 => Duck 有一个Behaviours 列表。

Duck 将维护一个 Behavior 对象列表。在创建Duck 对象期间填充相关行为。

示例代码:

import java.util.*;

interface Behaviour{

}
class FlyBehaviour implements Behaviour{

}
class QuackBehaviour implements Behaviour{

}
class XYZBehaviour implements Behaviour{

}

public class Duck{
    private List<Behaviour> duckBehaviours = new ArrayList<Behaviour>();

    public Duck(List<Behaviour> list){
        duckBehaviours = list;
    }
    public static void main(String[] args){
        // set the behaviours
        List<Behaviour> list = new ArrayList<Behaviour>();
        list.add(new FlyBehaviour());
        list.add(new QuackBehaviour());
        list.add(new XYZBehaviour());
        Duck duck = new Duck(list);
    }   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2012-07-18
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多