Java 需要澄清-设计模式

Java 需要澄清-设计模式,java,oop,design-patterns,inheritance,aggregation,Java,Oop,Design Patterns,Inheritance,Aggregation,在大多数设计模式概念中,都提到“hasaa”比“isa”更好 在第一章-头先设计模式-“设计模式简介”,章节“集成鸭子行为”(第15页),鸭子类引用了FlyBehavior和QuackBehavior接口类型。例如,我们将在特性名it XYZBehavior中添加一个新行为(假设客户机尚未决定),对于一种Duck,我们需要更改Duck类,使其具有对新接口的引用。因此,我们需要修改类,但这不应该根据良好的设计模式进行 你能建议我如何处理这个要求吗 这个问题可以通过使用 (在Java中,通常通过或)

在大多数设计模式概念中,都提到“hasaa”比“isa”更好

在第一章-头先设计模式-“设计模式简介”,章节“集成鸭子行为”(第15页),鸭子类引用了FlyBehavior和QuackBehavior接口类型。例如,我们将在特性名it XYZBehavior中添加一个新行为(假设客户机尚未决定),对于一种Duck,我们需要更改Duck类,使其具有对新接口的引用。因此,我们需要修改类,但这不应该根据良好的设计模式进行


你能建议我如何处理这个要求吗

这个问题可以通过使用

(在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设计模式的示例……您能为我们这些没有这本书的人提供一个代码示例吗?很好的示例。非常感谢你的解释。非常感谢你。