#freeze [[デザインパターン]] * Proxy [#zcfd99a9] ** 適応可能性 [#x456d0f6] オブジェクトへの単なるポインタよりも多機能で精巧な参照が必要なときには、いつでも Proxy パターンが適用可能である。 - remote proxy は、別のアドレス空間にあるオブジェクトのローカルな代理を提供する。 - virtual proxy は、コストの高いオブジェクトを要求があり次第生成する。 - protection proxy は、実オブジェクトへのアクセスを制御する。オブジェクトごとに異なるアクセス権が必要なときには、この protection proxy は有用である。たとえば、Choices オペレーティングシステム[CIRM93]の KernelProxy オブジェクトは、オペレーティングシステムのオブジェクトへのアクセスを保護する。 - smart reference は、通常のポインタに代わるものである。オブジェクトがアクセスされるときに、その smart reference はさらにアクションを実行する。この proxy の典型的な使い方を以下にあげる。 -- 参照されなくなった実オブジェクトを自動的に解放できるように、実オブジェクトへの参照個数を数えておく(smart pointer とも呼ばれる[Ede92])。 -- 永続オブジェクトが初めて参照されたときに、それをメモリ上にロードする。 -- 他のオブジェクトが実オブジェクトを変更することのないように、実オブジェクトがアクセスされる前に、それがロックされていることを確認する。 ** 構造 [#wf619647] &ref(proxy.gif); *** 構成要素 [#ad8f942d] : Proxy クラス (ImageProxyクラス) | -- RealSubject オブジェクトにアクセスするための参照を保持する。RealSubject クラスのインタフェースと Subject クラスのインタフェースが等しい場合には、Proxy クラスは Subject のオブジェクトを参照するようにしておくこともできる。 -- Proxy オブジェクトを RealSubject オブジェクトと置き換えられるように、Subject クラスと同一のインタフェースを提供する。 -- RealSubject オブジェクトへのアクセスを制御する。また、RealSubject オブジェクトの生成や消去に責任を持つこともある。 -- 他の責任は proxy の種類に依存する。 --- remote proxy は、要求と引数を符合化し、それを別のアドレス空間に存在する RealSubject オブジェクトに送る。 --- virtual proxy は、RealSubject オブジェクトへのアクセスを延期できるように、RealSubject オブジェクトに関する追加情報をキャッシュしておく。たとえば、「動機」の節であげた ImageProxy オブジェクトは、実画像の大きさをキャッシュしている。 --- protection proxy は、呼び出し側がその要求を実行するのに必要なアクセス権を持っているかどうかをチェックする。 : Subject クラス (Graphic クラス) | -- RealSubject オブジェクトを利用できるところならばどこでも Proxy オブジェクトを利用できるように、RealSubject クラスと Proxy クラスに共通のインタフェースを定義する。 : RealSubject クラス (Image クラス) | -- Proxy オブジェクトがその代理を務めることになる実オブジェクトを定義する。 ** 目的 [#pd6f8300] あるオブジェクトへのアクセスを制御するために、そのオブジェクトの代理、または入れ物を提供する。 ** コメント [#k9837913] ##comment_kcaptcha