2010-11-09 111 views
3

在大多数设计模式概念中,有人提到“有A”比“是A”更好。需要说明 - 设计模式

在第一章 - Head First设计模式 - “简介设计模式”,部分“集成鸭子行为”(第15号),鸭类具有FlyBehavior和QuackBehavior接口类型的引用。例如,我们将添加一个新特性名称为XYZBehavior(假设客户端尚未确定它)的新行为,我们需要更改Duck类以引用新接口。因此,我们需要改变班级,但不应按照良好的设计模式进行。

你能告诉我怎么处理这个要求?

+0

对不起添加来自Head First设计模式所采取的例子... – Famn 2010-11-09 10:46:35

+3

你能为我们这些没有这本书谁提供一个代码示例? – 2010-11-09 10:47:02

回答

0

如果您添加新行为(策略),则策略模式不会阻止更改类。如果现有行为(策略)发生变化,它只是防止触摸该类。我们认为,鸭子会听起来像“叮叮当当”,但经过多年的研究,我们意识到,鸭子听起来像是“quaack”。我们很幸运,我们实施了一个QuackBehaviour,并且调整了Common鸭子的QuackBehaviour接口的实现。这是这种模式的诀窍。

如果后面的话,我们决定添加一个SwimBehaviour,因为另一个研究小组认识到,游泳是一种常见的鸭子行为,那么我们必须触摸常见的鸭子并添加该行为(到Duck课程)。

希望它有帮助!

+0

很好的解释。非常感谢你。 – Famn 2010-11-11 05:44:16

1

这个问题可以通过使用Dependency Injection

(在Java中通常是通过两种SpringGuice

这里要解决的一个Beginner's Guide to dependency Injection

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

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

现在在配置文件中,您可以指定哪个B行为会被注入到鸟类中,而不必改变鸟类。

+0

很好的例子。非常感谢你 – Famn 2010-11-09 10:58:05

0

您可以通过使用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); 
    } 
}