gpt4 book ai didi

java - 装饰器模式如何遵循组合

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:14 28 4
gpt4 key购买 nike

我在 HeadFirst DesginPattern 一书中读到,装饰器模式使用组合关系动态地为对象提供附加功能。但是在下面的代码中我发现了聚合关系而不是组合。

据我所知,组合和聚合之间的区别是:

聚合:聚合对象的生命或存在是相互独立的,但一个对象扮演着另一个对象的所有者的角色。

复合:复合对象的生命或存在依赖于容器对象的存在,没有容器对象复合对象的存在是没有意义的。

public abstract class Girl {

String description = "no particular";

public String getDescription(){
return description;
}
}

public class AmericanGirl extends Girl {

public AmericanGirl(){
description = "+American";
}
}

public class EuropeanGirl extends Girl {

public EuropeanGirl() {
description = "+European";
}
}

public abstract class GirlDecorator extends Girl {

public abstract String getDescription();
}

public class Science extends GirlDecorator {

private Girl girl;

public Science(Girl g) {
girl = g;
}

@Override
public String getDescription() {
return girl.getDescription() + "+Like Science";
}

public void caltulateStuff() {
System.out.println("scientific calculation!");
}
}

public class Main {

public static void main(String[] args) {
Girl g1 = new AmericanGirl();
System.out.println(g1.getDescription());
Science g2 = new Science(g1);
System.out.println(g2.getDescription());
}
}

有人可以指出/解释上面的代码是如何遵循组合的吗?

最佳答案

aggregationcomposition 之间的相似性使它们经常被用作同义词。 IMO,如果您没有理由做出区分,那么不值得花时间讨论它实际上是什么。如果您确实有原因,您可能已经知道它属于哪个原因。

它们在概念上非常接近,以至于它们就是您对待它们的方式。如果您将关系用作单个单元,那么它就是一个组合。如果您与它们相互独立地进行交互,那么它就是一个聚合

主要细节在于它为何重要。我能想到的区分两者的主要需要是垃圾收集。在 聚合 中,容器的属性在其容器上下文之外可能仍然有意义。在 composition 中,容器的属性应随容器一起销毁。

当一个人观察到一个对象的存在值(value)与定义相反时,我相信它可以表示为两者。在某些情况下,您可能希望只销毁容器并保留内容 (aggregation)。但是,如果没有它的代表,它就毫无意义。这定义了某种逆合成。您永远不会想要销毁子级并保留装饰器。

尽管 Science 实际上是一个具体的 Girl,但是 Science.getDescription 的实现覆盖了基础实现以将请求委托(delegate)给一个具体的女孩。如果未使用有效的Girl 实现进行初始化,此实现细节会使Science 女孩变得毫无意义。

如果存在本身没有意义,那么它通常不是一个聚合,而是一个组合.

顺便说一句,装饰器通过实现一个接口(interface)而不是继承一个基类来表达得更清楚。坚持单一职责原则,您就可以确定装饰器不是主题的实现。

关于java - 装饰器模式如何遵循组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com