在大多数设计模式概念中,有人提到“有A”比“是A”更好。需要说明 - 设计模式
在第一章 - Head First设计模式 - “简介设计模式”,部分“集成鸭子行为”(第15号),鸭类具有FlyBehavior和QuackBehavior接口类型的引用。例如,我们将添加一个新特性名称为XYZBehavior(假设客户端尚未确定它)的新行为,我们需要更改Duck类以引用新接口。因此,我们需要改变班级,但不应按照良好的设计模式进行。
你能告诉我怎么处理这个要求?
在大多数设计模式概念中,有人提到“有A”比“是A”更好。需要说明 - 设计模式
在第一章 - Head First设计模式 - “简介设计模式”,部分“集成鸭子行为”(第15号),鸭类具有FlyBehavior和QuackBehavior接口类型的引用。例如,我们将添加一个新特性名称为XYZBehavior(假设客户端尚未确定它)的新行为,我们需要更改Duck类以引用新接口。因此,我们需要改变班级,但不应按照良好的设计模式进行。
你能告诉我怎么处理这个要求?
如果您添加新行为(策略),则策略模式不会阻止更改类。如果现有行为(策略)发生变化,它只是防止触摸该类。我们认为,鸭子会听起来像“叮叮当当”,但经过多年的研究,我们意识到,鸭子听起来像是“quaack”。我们很幸运,我们实施了一个QuackBehaviour,并且调整了Common鸭子的QuackBehaviour接口的实现。这是这种模式的诀窍。
如果后面的话,我们决定添加一个SwimBehaviour,因为另一个研究小组认识到,游泳是一种常见的鸭子行为,那么我们必须触摸常见的鸭子并添加该行为(到Duck
课程)。
希望它有帮助!
很好的解释。非常感谢你。 – Famn 2010-11-11 05:44:16
这个问题可以通过使用Dependency Injection
这里要解决的一个Beginner's Guide to dependency Injection
基本上,鸟将有一个行为属性:
private Collection<Behavior> behaviors;
public void setBehaviors(Collection<Behavior> behaviors){
this.behaviors = behaviors;
}
现在在配置文件中,您可以指定哪个B行为会被注入到鸟类中,而不必改变鸟类。
很好的例子。非常感谢你 – Famn 2010-11-09 10:58:05
您可以通过使用Composition
=>Duck
有一个列表Behaviours
来处理这种情况。
Duck
将维护行为对象的列表。在创建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);
}
}
对不起添加来自Head First设计模式所采取的例子... – Famn 2010-11-09 10:46:35
你能为我们这些没有这本书谁提供一个代码示例? – 2010-11-09 10:47:02