Java 需要澄清-设计模式
在大多数设计模式概念中,都提到“hasaa”比“isa”更好 在第一章-头先设计模式-“设计模式简介”,章节“集成鸭子行为”(第15页),鸭子类引用了FlyBehavior和QuackBehavior接口类型。例如,我们将在特性名it XYZBehavior中添加一个新行为(假设客户机尚未决定),对于一种Duck,我们需要更改Duck类,使其具有对新接口的引用。因此,我们需要修改类,但这不应该根据良好的设计模式进行Java 需要澄清-设计模式,java,oop,design-patterns,inheritance,aggregation,Java,Oop,Design Patterns,Inheritance,Aggregation,在大多数设计模式概念中,都提到“hasaa”比“isa”更好 在第一章-头先设计模式-“设计模式简介”,章节“集成鸭子行为”(第15页),鸭子类引用了FlyBehavior和QuackBehavior接口类型。例如,我们将在特性名it XYZBehavior中添加一个新行为(假设客户机尚未决定),对于一种Duck,我们需要更改Duck类,使其具有对新接口的引用。因此,我们需要修改类,但这不应该根据良好的设计模式进行 你能建议我如何处理这个要求吗 这个问题可以通过使用 (在Java中,通常通过或)
你能建议我如何处理这个要求吗 这个问题可以通过使用 (在Java中,通常通过或) 这里有一个 基本上,鸟会有一个行为属性:
private Collection<Behavior> behaviors;
public void setBehaviors(Collection<Behavior> behaviors){
this.behaviors = behaviors;
}
私人收藏行为;
公共无效设置行为(收集行为){
这个行为=行为;
}
现在,在一个配置文件中,您可以指定在不必更改Bird类的情况下将哪些行为注入Bird中。如果您添加一个新的行为(策略),策略模式不会阻止更改类。如果现有的行为(策略)发生变化,它只会阻止接触该类 关于嘎嘎行为的例子:我们认为,假设鸭子听起来像“嘎嘎”,但经过几年的研究,我们意识到鸭子实际上听起来像“嘎嘎”。幸运的是,我们实现了一个QuackBehavior,并为普通鸭子调整了QuackBehavior接口的实现。这就是这种模式的诀窍 如果后来,我们决定增加一种游泳行为,因为另一个研究小组意识到,游泳是一种常见的鸭子行为,那么我们必须触摸普通的鸭子,并将这种行为添加到
鸭子
类中
希望有帮助 您可以使用
合成=>鸭子有一个行为列表来处理此场景
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);
}
}
import java.util.*;
界面行为{
}
类flyBehavior实现行为{
}
类QuackBehavior实现行为{
}
类XYZBehaviour实现行为{
}
公务舱鸭{
private List duckbehaviors=new ArrayList();
公鸭(名单){
行为=列表;
}
公共静态void main(字符串[]args){
//设定行为
列表=新的ArrayList();
添加(新的flyBehavior());
添加(新的QuackBehavior());
添加(新的XYZBehaviour());
鸭子=新鸭子(列表);
}
}
很抱歉添加来自Head First设计模式的示例……您能为我们这些没有这本书的人提供一个代码示例吗?很好的示例。非常感谢你的解释。非常感谢你。