我在 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());
}
}
有人可以指出/解释上述代码如何遵循组合吗?