装饰通过构造函数注入与简单继承

gol*_*ger 6 design-patterns inversion-of-control

有人可以告诉我使用另一个类的构造函数注入而不是类继承创建装饰器类之间的差异(如在好处中)?在我能想到的例子中,我可以通过两种方式之一实现相同的最终目标,但我怀疑我缺少一些基本的东西.

Joh*_*ell 4

装饰器模式涉及对象的组合。为了能够继承该对象的类型,它显然必须是可继承的。并非所有类型都是为继承而设计的,即意味着是基类,即使从纯粹的技术角度来看它们可以被继承(我认为这是一个设计缺陷)。

\n\n

装饰器模式存在的理由是能够修改对象的行为而不修改对象本身。通过继承,您本质上是在修改对象本身,然后您得到的是通过多态性进行的常规行为更改,这意味着您没有完成相同的事情。

\n\n

所以,装饰和继承都有其用途。当其中任何一个为真时使用装饰

\n\n
    \n
  • 你不能继承(例如,如果该类是sealedC# 中的)
  • \n
  • 你不应该继承(该类显然不应该是基类)
  • \n
  • 您想要多次更改一个特定对象的行为(通过用不同行为的装饰器包装它)
  • \n
\n\n

请注意,继承是 OO 工具箱中最强大的工具。权力越大,责任越大,而这并不总是那么容易应对。我想说:总是组合或聚合。当无法做到这一点时,继承。如果你不能继承,那就更加努力地组合或聚合。”

\n