代理人が処理を代行。
インスタンスの生成に時間がかかるようなものはまず代理人で処理を代行し、代理人では実行できない要求がきたときに実際のインスタンスを生成する。
またWebのProxyサーバーのようにアクセス要求がきたとき、そのページをキャッシュしてあったときはそれを使い、キャッシュしていない場合は本当のWebサーバーにアクセスする。
ゲームではRPGのステータス表示のメニューに使えそうだ。ステータス表示でカーソル位置によってはモデルデータも表示するような場合、どうしてもモデルデータの読み込みに時間がかかる。そこでProxyでまずパラメータを表示しておいて、モデルデータは必要になってから表示する。
// ステータスを表示するインタフェース public interface Status { public abstract void printStatus(); public abstract void printModel(); }
// 実際のステータスのクラス public class RealStatus implements Status { public RealStatus() { // コンストラクタでモデルデータの読み込み } public void printStatus() { // ステータスを表示する } public void printModel() { // モデルデータを表示する } }
// Proxyのステータスのクラス public class ProxyStatus implements Status { private RealStatus real; public void printStatus() { // ステータスを表示する } public void printModel() { // RealStatusを作成し表示する。 real = new RealStatus(); real.printModel(); } }
// テスト void doTest() { Status status = new ProxyStatus(); // Proxyでステータスの表示 status.printStatus(); // モデルの表示。 // ここでRealStatusが作成されモデルデータが読み込まれる。 status.printModel(); }
※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
ゲームでは直接攻略するのとは関係のないメニューのようなところではストレスをためないようにすることが大切。そこでこのProxyパターンを使って待ち時間を減らすようにする。
使う側からはProxyなのかそうではないのかということを意識させないことが重要。
参考文献:(旧版)Java言語で学ぶデザインパターン入門
参考:ギコ猫とProxyパターン