Ruby on Railsパターン-デコレーター対プレゼンター


112

最近、Ruby on Railsコミュニティでは、デコレータとプレゼンタについてあらゆる種類の話があります。

2つの間の本質的な違いは何ですか?ある場合、どちらを使用するかを教えてくれる手掛かりは何ですか?または、2つを組み合わせて使用​​することはできますか?

回答:


102

デコレータは、「このエンティティにいくつかの機能を追加しましょう」という意味です。プレゼンターは、「モデル/バックエンドとビューの間の橋を架けよう」のようなものです。発表者パターンにはいくつかの解釈があります。

デコレータは一般的/一般的な目的です。プレゼンターは、より狭い範囲の責任/用途を持っています。デコレーターはドメイン全体で使用され、プレゼンターはほとんど常にビューのような機能に関連しています。


3
ありがとう。Draper gemはプレゼンターとデコレーターのハイブリッドであるようです。
keruilin

17
@keruilin心に留めておくべきことの1つ:継承の制限を回避することを目的とするため、デコレーターは他のデコレーターを(コンポーネントオブジェクトをデコレートするのと同様に)デコレートできるはずです。(Draperはこれを行いませ)。デコレータパターンは、その意味で複合パターンに非常に似ていますが、インサイドアウトではなくアウトサイドインから処理される点が異なります(意味がある場合)。
汚れ

7
私はデコレーターを汎用パターンとして、プレゼンターをビューレイヤーに関連するデコレーターの特定のアプリケーションとして見ています。
クリス

2
@Smudge、ドレーパーデコレーターは、少なくとも、基礎となるモデルにSTI関係があるかのように、他のデコレートを装飾できます。
keruilin 2012

現在、Draperはプレゼンテーションレイヤーラッパーとして自分自身を識別しているようです。つまり、Draperはもはやデコレーターではなく、実際にはプレゼンターです。GHから:「DraperはRailsアプリケーションにプレゼンテーションロジックのオブジェクト指向レイヤーを追加します。」
Jared

35

これを確認することをお勧めします- 展示vsプレゼンター

デコレータは、特定のオブジェクトの他のインスタンスに影響を与えることなく、特定のオブジェクトをラップすることによってその機能を拡張するために使用されるデザインパターンです。一般に、デコレータパターンは開閉の原則の例です (クラスは変更のために閉じられていますが、拡張のために利用できます)。

展示パターンと発表者パターンは、どちらもデコレータパターンの一種です。


マイクパックによるそのブログ投稿へのリンクの+1。パターン間の違いを説明する優れた記事。
ki4jnq 2016

展示パターンについて言及する場合は+1。それを説明するAvdi Grimmの本を手に入れました。しかし、それは私の問題に対する正しい解決策ではありませんでしたが、それでも驚くべきパターンです。思考のための優れた食べ物。
Yonk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.