有人可以请我通过使用构造函数注入另一个类而不是类继承创建装饰类的区别(如同在好处中)吗?在我能想到的例子中,我可能以两种方式之一完成相同的最终目标,但我怀疑我缺少一些基本的东西。通过构造函数注入装饰与简单继承
回答
装饰者模式涉及构成的一个对象。为了能够继承该对象的类型,它显然必须是可继承的。并非所有的类型都是为了继承而设计的,也就是说,它们的目的是作为基类,即使它们从纯粹的技术观点可以继承(我认为这是一个设计缺陷)。
装饰者模式的存在理由是能够在不修改对象本身的情况下修改对象的行为。通过继承,你基本上修改了对象本身,然后你通过多态来定期改变行为,这意味着你没有完成同样的事情。
因此,装饰和继承都有其用途。使用装修时,这些人是真正的
- 你不能继承(例如,如果类是
sealed
在C#) - 你不应该继承(类显然并不意味着是一个基类)
- 你想(通过与不同行为的装饰包裹它)来改变一个特定对象多次行为
注意继承是最有力的工具存在于二OO工具箱。拥有巨大的权力会带来很大的责任,这并不总是很容易处理。我会说:总是撰写或汇总。当无法完成时,继承。如果你不能继承,更努力地尝试撰写或聚合“
我将恢复如下:?
当你要继承
当对象是来自同一个语义层次和代表一个是,一个关系。
这是什么意思吗?
那 是-aFeline
,确实是Feline
是-aVertebrate
等等。
你应该什么时候装饰?
当对象不代表is-a的关系。但是,是的,Coffee
和Milk
都可以位于同一层次。但是,如果你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。
装饰的另一个非常好的理由是,它给你选择装饰接口而不是类。然后你变得非常松散耦合,并且可以在不编写更多代码的情况下将正交装饰行为添加到接口的多个实现。
- 1. 简单注入器注册与多个构造函数
- 2. 继承非构造函数
- 3. 构造函数和继承
- 4. Java继承 - 构造函数
- 5. Java构造函数继承?
- 6. 构造函数和继承?
- 7. 构造函数和继承
- 8. 构造函数继承
- 9. Java继承/构造函数
- 10. C#继承构造函数
- 11. Java的继承与构造函数
- 12. Java - 继承与构造函数错误
- 13. 与构造继承
- 14. 简单继承后调用复制构造函数
- 15. 简单的构造函数两难困境 - 继承
- 16. 通过传递构造函数参数继承属性
- 17. 继承构造函数的默认访问修饰符
- 18. C++ 11继承构造函数和访问修饰符
- 19. C++构造函数,继承,访问修饰符和东西
- 20. 继承装饰类
- 21. 通过构造,构造函数不工作的后续VBA继承?
- 22. 在java中调用继承构造函数的构造函数
- 23. 删除复制构造函数break继承构造函数
- 24. 继承构造函数和默认构造函数
- 25. 在Spring中通过注释向构造函数注入参数
- 26. 统一:构造函数注入与多个构造函数
- 27. 可变参数构造函数继承
- 28. 构造函数参数和继承
- 29. 如何使用构造函数参数注册继承服务?
- 30. 父类默认构造函数由用户输入,然后通过继承 - C++
精彩的解释! – goldfinger