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

Posted

技术标签:

【中文标题】Ruby on Rails 模式 - 装饰器与演示器【英文标题】:Ruby on Rails patterns - decorator vs presenter 【发布时间】:2011-12-13 04:52:23 【问题描述】:

最近在 Ruby on Rails 社区中有各种关于 decorators 和演示者的讨论。

两者的本质区别是什么?如果有,有什么线索可以告诉我使用哪一个而不是另一个?或者也许将两者结合使用?

【问题讨论】:

【参考方案1】:

装饰器更像是“让我们为这个实体添加一些功能”。演示者更像是“让我们在模型/后端和视图之间架起一座桥梁”。演示者模式有多种解释。

装饰器是通用/通用的。演示者的职责/用途范围较窄。装饰器跨域使用,演示者几乎总是与类似视图的功能相关。

Draper网站 RailsCasts Draper Episode

【讨论】:

谢谢。似乎 Draper gem 是演示者和装饰者的混合体。 @keruilin 要记住的一件事:装饰器真的应该能够装饰其他装饰器(以及装饰组件对象),因为它们的目的之一是绕过继承的限制。 (德雷珀这样做)。在这个意义上,装饰器模式与复合模式非常相似,除了从外向内而不是从内向外处理(如果有意义的话)。 我认为装饰器是一种通用模式,而presenter是与视图层相关的装饰器的特定应用。 @Smudge,draper 装饰器可以装饰其他装饰器,至少就像底层模型具有 STI 关系一样。 现在 Draper 似乎将自己标识为表示层包装器 - 所以它不再是装饰器,而是实际上的演示器。来自他们的 GH:“Draper 为您的 Rails 应用程序添加了一个面向对象的表示逻辑层。”【参考方案2】:

我建议你检查一下 - Exhibit vs Presenter。

装饰器是一种设计模式,用于通过包装特定对象来扩展其功能,而不影响该对象的其他实例。一般来说,装饰器模式是open/close principle 的一个示例(该类对修改关闭,但可用于扩展)。

展示者模式和展示者模式都是装饰者模式的一种。

【讨论】:

+1 用于链接到 Mike Pack 的博客文章。解释模式之间差异的优秀帖子。 +1 用于提及展览模式。我最终得到了解释它的 Avdi Grimm 的书。虽然,这不是我的问题的正确解决方案,但它仍然是一个惊人的模式。值得深思的绝佳食物。

以上是关于Ruby on Rails 模式 - 装饰器与演示器的主要内容,如果未能解决你的问题,请参考以下文章

在生产模式下登录 Ruby on Rails

Ruby on Rails AJAX文件上传

Ruby on Rails 迁移 - 创建新的数据库模式

ruby on rails 中的引导模式不起作用(不显示)

何时在 Ruby on Rails 中使用 memoization

在 AJAX 更新 Ruby on Rails 6 后,语义 UI 模式不会重新打开