1. ホーム
  2. oop

[解決済み] ProxyパターンとDecoratorパターンの違い

2022-04-22 01:41:31

質問

とは何が違うのか、何か良い説明はないでしょうか? プロキシ デコレーター ?

私が見た主な相違点は、私たちが以下を仮定したとき プロキシ が使用します。 コンポジション デコレーター アグリゲーション であれば、複数(1つ以上)の デコレーター では、既存のインスタンスを変更したり、機能を追加したりすることができます(デコレーション)。 プロキシ は、プロキシされるクラスの内部インスタンスを持ち、いくつかの追加機能 (プロキシの振る舞い) を追加してそれに委譲します。

問題は プロキシ アグリゲーションで作成されたものは、やはり プロキシ というか デコレーター ? GoFのパターンでは、定義上 プロキシ を集約しているのでしょうか?

解決方法は?

以下は、GoFからの直接の引用です(216ページ)。

<ブロッククオート

デコレータはプロキシと似たような実装を持つことができますが、デコレータの目的は異なります。デコレータはオブジェクトにひとつまたは複数の責務を追加しますが、 プロキシはオブジェクトへのアクセスを制御します。

プロキシは、デコレータのような実装をどの程度行うかによって異なります。A 保護プロキシはデコレーターと全く同じように実装されるかもしれません。一方 一方、リモートプロキシは、実サブジェクトへの直接的な参照を持たず のような間接的な参照である。 最初はファイル名などの間接的な参照から始まりますが、最終的には を取得し、直接参照を使用する。

よくある回答は、Proxyはそのデリゲートの具象型を知っているというものです。この引用文から、それが常に正しいとは限らないことがわかります。

GoFによるとProxyとDecoratorの違いは、Proxyが 制限する クライアントが Decoratorはそうではありません。プロキシは、クライアントの する 機能へのアクセスを制御したり、クライアントが 知っている は、クライアントには見えないし、わからないアクションを実行することによって。Decoratorはその逆で、デリゲートが行うことをクライアントに見える形で拡張します。

Proxyはブラックボックスであり、Decoratorはホワイトボックスと言えるかもしれません。

ProxyとDecoratorを対比する際に、WrapperとDelegateの構成関係に注目するのは間違っています。wrapperとclientの関係こそが、この2つのパターンを区別するものなのです。

  • Decoratorはクライアントに情報を提供し、力を与えます。
  • プロキシはクライアントを制限し、無力化する。