Proxy は、 構造に関するデザインパターンの一つで、 クライアントが使う本物のサービス・オブジェクトの代理として機能するオブジェクト (プロキシー) を提供します。 プロキシーは、 アクセス制御、 キャッシングなど、 何らかの作業を行なった後、 リクエストをサービス・オブジェクトに渡します。
プロキシー・オブジェクトはサービスと同じインターフェースを持ち、 クライアントにとっては、 本物のオブジェクトと交換可能です。
複雑度:
人気度:
使用例: Proxy パターンは、 ほとんどの Java アプリケーションにおいては、 あまり見かけませんが、 いくつかの特殊なケースでは便利です。 何らかの既存クラスのオブジェクトに何らかの振る舞いを追加したいがクライアント・コードには手を加えたくない時、 かけがえのないものです。
標準 Java ライブラリー内のプロキシーの例:
見つけ方: プロキシーは、 実際の作業はすべて他のオブジェクトに委任します。 プロキシーがサービスのサブクラスである場合を除き、 プロキシーのメソッドのそれぞれは、 最終的にはサービス・オブジェクトを参照するはずです。
キャッシング・プロキシー
この例では、 遅延初期化と非効率な外部製作の YouTube 統合ライブラリーのキャッシングの実装に、 Proxy パターンが利用されています。
変更不可能なクラスにいくつかの追加の振る舞いを加える必要がある時、 Proxy は非常に貴重です。
some_cool_media_library
some_cool_media_library/ThirdPartyYouTubeLib.java: リモート・サービス・インターフェース
some_cool_media_library/ThirdPartyYouTubeClass.java: リモート・サービスの実装
some_cool_media_library/Video.java: ビデオ・ファイル
proxy
proxy/YouTubeCacheProxy.java: キャッシング・プロキシー
downloader
downloader/YouTubeDownloader.java: メディア・ダウンローダー・アプリ
Demo.java: 初期化コード
OutputDemo.txt: 実行結果