読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

21.Proxy 必要になってから作る

proxy=代理人
たとえばコンストラクタが重い場合はproxyパターンの適用対象となる。
使う前にインスタンスを作成しても実際に使われない限りはコンストラクト処理にかかった時間が無駄になる。そこで対象クラスと同じインターフェースを持つproxyクラスによって、対象クラスによる処理が必要になるまで代役を務める。
proxyクラスが対象クラスより軽いものであれば、対象クラスが実際には使われなかった場合、時間の短縮となる。
対象クラスはproxyクラスの存在を知らなくてもいい。

f:id:p-monster:20121218195918p:plain

Subject・・・ProxyとRealSubjectを同一視するためのAPI
Proxy・・・Clientからの要求をできるだけ処理。Proxyだけで処理できない場合はRealSubjectに任せる。必要になったらRealSubject生成。Subject実装
RealSubject・・・Proxyで手に負えない処理を引き受ける。Subject実装
Client・・・Proxyパターンを利用する

代理人を使ってスピードアップ。
重い処理を行うタイミングを遅らせる。それによってたとえばアプリケーションの起動時に初期化で時間を取られなくて済むようにできる。初期化が必要になるまでタイミングを遅らせる。
代理人と本人を分ける意味・・・本人の修正をしなくてもタイミングをずらすことが可能。

さまざまなプロキシー
VertualProxy・・・本当にインスタンスが必要になった時点で、生成・初期化を行う
RemoteProxy・・・RealSubjectはネットワークの向こう側にいるのに、側にいるように見せかける
AccessProxy・・・RealSubjectの機能に対して、アクセス制限をかける。ユーザーを管理してメソッドを呼び出しの可否など。

関連しているパターン

Adapter・・・AdapterパターンはAPIが異なるオブジェクトの間を埋める働きをする。ProxyパターンはProxyとRealSubjectでAPIは同じ
Decorator・・・DecoratorパターンとProxyパターンは似ているけど目的が異なる。Decoratorパターンの目的は新しい機能を追加すること。Proxyパターンの目的は本人の作業を肩代わりして本人へのアクセスを軽減する。

参考:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門