在大多数设计模式概念中,有人提到“Has A”比“Is A”更好。
在第一章 - 头部优先设计模式 - “设计模式简介”,“整合鸭子行为”(第15页)一节中,Duck类引用了FlyBehavior和QuackBehavior界面类型。例如,我们将在功能名称中添加一个新行为XYZBehavior(只是假设客户端还没有决定它)对于一种Ducks,我们需要更改Duck类以获得对新接口的引用。结果,我们需要改变类,但不应该根据良好的设计模式发生。
您能否建议我如何处理此要求?
答案 0 :(得分:1)
这是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);
}
}