需要澄清 - 设计模式

时间:2010-11-09 10:42:16

标签: java oop design-patterns inheritance aggregation

在大多数设计模式概念中,有人提到“Has A”比“Is A”更好。

在第一章 - 头部优先设计模式 - “设计模式简介”,“整合鸭子行为”(第15页)一节中,Duck类引用了FlyBehavior和QuackBehavior界面类型。例如,我们将在功能名称中添加一个新行为XYZBehavior(只是假设客户端还没有决定它)对于一种Ducks,我们需要更改Duck类以获得对新接口的引用。结果,我们需要改变类,但不应该根据良好的设计模式发生。

您能否建议我如何处理此要求?

3 个答案:

答案 0 :(得分:1)

使用Dependency Injection

可以解决该问题

(在Java中通常通过SpringGuice

这是Beginner's Guide to dependency Injection

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

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

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

答案 1 :(得分:0)

如果添加行为(策略),策略模式不会阻止更改类。如果现有行为(策略)发生变化,它只会阻止触及课程。

QuackBehaviour的例子:假设,我们认为,鸭子会听起来像“贪吃”,但经过几年的研究,我们意识到,鸭子实际上听起来像“贪吃”。我们很幸运,我们实施了一个QuackBehaviour,只是调整了常见鸭子的QuackBehaviour接口的实现。这就是这种模式的诀窍。

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

希望它有所帮助!

答案 2 :(得分:0)

您可以使用Composition =&gt;来处理此方案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);
    }   
}