Ruby on Rails模式 - 装饰者与演示者

ker*_*lin 109 design-patterns ruby-on-rails decorator presenter

最近在Ruby on Rails社区中有关于装饰器和演示者的各种各样的讨论.

这两者之间的本质区别是什么?如果有,有哪些线索告诉我哪一个使用哪一个?或者也许将两者结合使用?

Dav*_*ton 100

装饰器更像是"让我们为这个实体添加一些功能".演示者更像是"让我们在模型/后端和视图之间建立桥梁".演示者模式有几种解释.

装饰器是通用/通用的.演示者的责任/用途范围较窄.装饰器跨域使用,演示者几乎总是与视图一样的功能相关.

  • @keruilin要记住的一件事:装饰者应该能够装饰其他装饰器(以及装饰组件对象),因为他们的目的之一是绕过继承的限制.(德雷珀*不*做这个).装饰模式在这个意义上非常类似于复合模式,除了从外向内处理而不是从内向外处理(如果这是有意义的). (16认同)
  • 我将装饰器视为通用模式,并将演示者视为与视图层相关的装饰器的特定应用程序. (7认同)
  • 谢谢.看起来像Draper gem是演示者和装饰者的混合体. (3认同)
  • @Smudge,draper装饰器可以装饰其他装饰,至少就好像底层模型有STI关系一样. (2认同)

dpa*_*luy 34

我建议你查看一下 - Exhibit vs Presenter.

Decorator是一种设计模式,用于通过包装特定对象来扩展特定对象的功能,而不会影响该对象的其他实例.通常,装饰器模式是打开/关闭原则的一个示例 (该类因修改而关闭,但可用于扩展).

展览和演示者模式都是一种装饰者模式.