2012-08-26 62 views
6

有人可以请我通过使用构造函数注入另一个类而不是类继承创建装饰类的区别(如同在好处中)吗?在我能想到的例子中,我可能以两种方式之一完成相同的最终目标,但我怀疑我缺少一些基本的东西。通过构造函数注入装饰与简单继承

回答

4

装饰者模式涉及构成的一个对象。为了能够继承该对象的类型,它显然必须是可继承的。并非所有的类型都是为了继承而设计的,也就是说,它们的目的是作为基类,即使它们从纯粹的技术观点可以继承(我认为这是一个设计缺陷)。

装饰者模式的存在理由是能够在不修改对象本身的情况下修改对象的行为。通过继承,你基本上修改了对象本身,然后你通过多态来定期改变行为,这意味着你没有完成同样的事情。

因此,装饰和继承都有其用途。使用装修时,这些人是真正的

  • 你不能继承(例如,如果类是sealed在C#)
  • 你不应该继承(类显然并不意味着是一个基类)
  • 你想(通过与不同行为的装饰包裹它)来改变一个特定对象多次行为

注意继承是最有力的工具存在于二OO工具箱。拥有巨大的权力会带来很大的责任,这并不总是很容易处理。我会说:总是撰写或汇总。当无法完成时,继承。如果你不能继承,更努力地尝试撰写或聚合“

+0

精彩的解释! – goldfinger

0

我将恢复如下:?

当你要继承

当对象是来自同一个语义层次和代表一个是,一个关系。

这是什么意思吗?

是-aFeline,确实是Feline是-aVertebrate等等。

你应该什么时候装饰?

当对象不代表is-a的关系。但是,是的,CoffeeMilk都可以位于同一层次。但是,如果你were to sell Cappuccino你不会说咖啡是-al牛奶,而不是你用Milk装饰它。

结论:

Is-a是从has-a不同。一种是亚型,另一种是部分的组成。

可是,看到以下内容:https://stackoverflow.com/questions/1621344/head-first-design-patterns-decorator-pattern

一个真实世界的例子,是为了使ACL检查,为您的控制器或服务security container as a Decorator

0

装饰的另一个非常好的理由是,它给你选择装饰接口而不是类。然后你变得非常松散耦合,并且可以在不编写更多代码的情况下将正交装饰行为添加到接口的多个实现。