我已经阅读了来自 Wikipedia 的装饰器设计模式,以及来自这个站点的代码示例。
我认为传统继承遵循“is-a”模式,而装饰器遵循“has-a”模式。装饰器的调用约定看起来像是在“皮肤”之上的“皮肤”……在“核心”之上。例如
I* anXYZ = new Z( new Y( new X( new A ) ) );
如上面的代码示例链接所示。
但是,我仍然有几个问题我不明白:
wiki 所说的“装饰器模式可用于在运行时扩展(装饰)某个对象的功能”是什么意思?'new ...(new... (new...))' 是一个运行时调用,很好,但是一个 'AwithXYZ anXYZ;' 是编译时的继承并且不好?
从代码示例链接中,我可以看到两个实现中类定义的数量几乎相同。我记得在其他一些设计模式书籍中,比如“Head first design patterns”。他们以 starbuzz coffee 为例,说传统继承会导致“类爆炸”,因为对于咖啡的每种组合,你都会为它想出一个类。
但是在这种情况下,装饰器不一样吗?如果装饰器类可以采用任何抽象类并对其进行装饰,那么我想它确实可以防止爆炸,但是从代码示例中,您有确切的类定义#,不少于......
有人会解释吗?