当我们看到 以前的设计 使用继承并没有那么好。在这篇文章中,我们讨论了装饰图案在前一集中的设计问题。
null
所以我们现在要做的是拿一个披萨,在运行时用配料“装饰”它:
- 拿一个披萨物体。
- 用辣椒装饰它。
- 用芝士堡装饰它。
- 调用getCost()并使用委派而不是继承来计算浇头成本。
我们最后得到的是一个披萨,上面有奶酪和辣椒。可视化“装饰器”对象,如包装。以下是装饰师的一些属性:
- 装饰者与他们装饰的对象具有相同的超级类型。
- 可以使用多个装饰器包装一个对象。
- 由于装饰器和对象的类型相同,我们可以传递装饰对象而不是原始对象。
- 我们可以在运行时装饰对象。
定义:
decorator模式动态地将额外的职责附加到对象上。装饰器为扩展功能提供了一种灵活的子类化替代方案。
类图: 图片src: 维基百科
- 每个组件可以单独使用,也可以由装饰师包装。
- 每个decorator都有一个实例变量,该变量保存对它所修饰的组件的引用(has-A关系)。
- 具体组件是我们要动态装饰的对象。
优势:
- decorator模式可用于在运行时扩展(装饰)特定对象的功能 .
- decorator模式是子类化的替代方案。子类化会在编译时添加行为,并且更改会影响原始类的所有实例;装饰可以在运行时为单个对象提供新的行为。
- Decorator提供了一种现收现付的方式来增加责任。您可以定义一个简单的类,并使用Decorator对象递增地添加功能,而不是试图在一个复杂的、可定制的类中支持所有可预见的功能。
缺点:
- decorator会使组件的实例化过程复杂化,因为您不仅需要实例化组件,还需要将其封装在多个decorator中。
- 让装潢师跟踪其他装潢师可能会很复杂,因为回顾装潢师链的多个层次会开始推动装潢师模式超出其真正意图。
参考资料:
- 头先设计模式(书)
- https://neillmorgan.wordpress.com/2010/02/07/decorator-pattern-pros-and-cons/
- https://en.wikipedia.org/wiki/Decorator_pattern
- http://stackoverflow.com/questions/4842978/decorator-pattern-versus-sub-classing
在下一篇文章中,我们将讨论decorator模式的实现。
本文由 苏拉布·库马尔 .如果你喜欢GeekSforgek,并且想贡献自己的力量,你也可以写一篇文章,并将文章邮寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END