6

プロキシ パターンは、要求を処理する必要があるかどうかのチェックを適用するなどの追加の処理を行った後、要求を Real サブジェクトに委任します。

以下のようなクラス図があります

ここに画像の説明を入力

プロキシ クラスには、具体的なサブジェクトへの直接参照があります。

Decorator パターンは、コンポーネントの動作を豊かにします [プロキシのように、いくつかの追加処理を行い、操作を実際のコンポーネントに委譲します]。このパターンのクラス ダイアグラムはプロキシ パターンに似ていますが、コンポーネントのインターフェイスへの参照があることだけが異なります。

ここに画像の説明を入力

クラスは実装ではなくインターフェイスにのみ依存する必要があるため、プロキシクラスに具体的な実際のサブジェクトがあると、単体テストが困難になります。私の質問は、Proxy パターンにも Real サブジェクトによって公開されたインターフェイスへの参照がある場合、それは Decorator パターンと同等になるかということです。その場合プロキシパターンのクラス図も以下のようになります

ここに画像の説明を入力

4

2 に答える 2

2

はい。構造を見ると、DecoratorProxyの両方で同じになります。意図が違うだけ。

デコレータ:

  1. 実行時にオブジェクトに動作を追加します。継承は、この機能を実現するための鍵であり、これはこのパターンの長所と短所の両方です。
  2. インターフェイスの動作を変更します。

例 (連鎖あり): &インターフェイスに関連するjava.ioパッケージ クラスInputStreamOutputStream

FileOutputStream fos1 = new FileOutputStream("data1.txt");  
ObjectOutputStream out1 = new ObjectOutputStream(fos1);

結果

  1. 装飾は、実行時にクラス全体ではなく、オブジェクトに機能を追加するのに便利です。装飾を使用すると、追加された機能を動的に削除することもできます。
  2. 装飾は実行時にオブジェクトに機能を追加するため、システム機能のデバッグが難しくなります。

プロキシー:

  1. オブジェクトをキャッシュし、クライアント/呼び出し元へのアクセスを制御することにより、遅延初期化、パフォーマンスの向上に使用します。別の動作を提供したり、実際のオブジェクトを呼び出したりする場合があります。このプロセス中に、新しいオブジェクトが作成される場合があります。
  2. オブジェクトのチェーンを許可する Decorator とは異なり、Proxy はチェーンを許可しません。

例: java.rmiパッケージ クラス

重要ポイント:

  1. プロキシは同じインターフェイスを提供します。Decoratorは拡張されたインターフェースを提供します。
  2. DecoratorProxyは目的は異なりますが、構造は似ています。どちらも、別のオブジェクトに一定レベルの間接性を提供する方法を記述しており、実装はリクエストの転送先のオブジェクトへの参照を保持します。

便利なリンク:

wikiepdia のDecorator_pattern

ソースメイキングのデコレーター

oodesignのデコレータ パターン

ウィキペディアの Proxy_pattern

ソースメイキングからのプロキシ

oodesignのプロキシ パターン

于 2016-04-07T12:38:16.427 に答える