3

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

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

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

4

3 回答 3

1

这个问题可以通过使用依赖注入来解决

(在 Java 中通常通过SpringGuice

这是依赖注入的初学者指南

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

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

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

于 2010-11-09T10:50:45.253 回答
0

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

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

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

希望它有所帮助!

于 2010-11-09T12:09:12.027 回答
0

您可以使用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);
    }   
}
于 2016-07-04T15:15:57.110 回答