【发布时间】:2012-09-04 23:33:53
【问题描述】:
我已经阅读了来自 Wikipedia 的 decorator design pattern,以及来自 this site 的代码示例。
我看到传统继承遵循“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 为例,说传统继承会导致'类爆炸',因为对于咖啡的每种组合,你都会为它想出一个类。
但是在这种情况下装饰器不一样吗?如果装饰器类可以采用任何抽象类并对其进行装饰,那么我想它确实可以防止爆炸,但是从代码示例中,您有确切的类定义#,不少于...
谁能解释一下?
【问题讨论】:
标签: c++ design-patterns