デザインパターン学習メモ:「Proxy」


このパターンの目的

GoF本より引用する。

あるオブジェクトへのアクセスを制御するために、そのオブジェクトの代理、または入れ物を提供する。(P.221)

「代理」を使ったほうがよいケースはいくつかある。たとえば、重い処理は必要になる時まで遅延させ、代理のオブジェクトが代わりに応答することでレンスポンスタイムが短くなる。

GoF本では、エディタにおける画像の読み込みの例が挙げられている。

エディタでは、その画像が本当に必要になるまで(その箇所が利用者に読まれるまでは)、画像ファイルの読み込み(ディスクへのIOが大きい)は遅延させてよい。つまり、ファイルをオープンした時に、すべての画像をディスクから読みだす必要はない。

その他の用途としては、実際のオブジェクトが処理を行う(メソッドを実行する)前後に、プロキシオブジェクトによる処理を実行することができるようになる。

構造

Subject

プロキシオブジェクトと実オブジェクトが共に実装するインタフェース

Proxy

プロキシオブジェクト。利用者はこのインスタンスを生成して利用する。
一部の処理(メソッド)を実オブジェクトに委譲する。その前後にプロキシオブジェクトは独自の処理を実行する可能性もある。

Real Subject

実オブジェクト。利用者はプロキシオブジェクトを使う代わりに、こちらのクラスを使うこともできる。

実装例

簡単に書ける有効な例が思いつかなかった。

「1.Real Subjectは生成に時間がかかり、2.Proxy単体でもある程度の仕事ができる」という例を考えたが、何も思い浮かばない。

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ