
「Proxy(プロキシ)」ってどんなパターン?
既存クラスのメソッドが呼ばれた際に、一旦中間的な処理を実行してから渡すパターンです。
メリット
あるメソッドに、中間的な処理を加えることができます。
中間的な処理の例としては下記です。
- メソッドの呼び出し、完了をログに記録する。
- メソッドの実行可否を判定する。(機能的な意味ではなく、権限的な意味で。)
クラス設計の方法
インターフェイスを作って、「プロキシを適用したいクラス」と、「プロキシを実装するクラス」にそれぞれインターフェイスを実装させて、「プロキシを実装するクラス」にだけ、処理を追加する設計にします。
Decorator(デコレータ)との違いは?
Decoratorも、デコレータ用のクラスを作って、同じインターフェイスを実装させる設計になっており似ていますよね。
「Decorator」と「Proxy」違いとしては、下記です。
パターン | 特徴 |
---|---|
Decorator | 既存の処理に機能を追加する。 |
Proxy | 既存の処理に、機能とは違う別の処理(ログ出力等)を追加する。 |
実際に実装してみる。
下記のようなクラス図になります。
Main.java(メインプログラム)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package proxy; public class Main { public static void main(String[] args) { //プロキシ適用前 Usually usu = new Usually(); usu.MethodA(); System.out.println("------------------"); //プロキシ適用後 ProxyImpl proxy = new ProxyImpl(usu); proxy.MethodA(); } } |
ProxyTest.java(プロキシのインターフェイス)
1 2 3 4 5 |
package proxy; public interface ProxyTest { void MethodA(); } |
Usually.java(普通のクラス:これをプロキシに一旦ゆだねる。)
1 2 3 4 5 6 7 8 9 |
package proxy; public class Usually implements ProxyTest{ public void MethodA() { System.out.println("普通の処理です。"); } } |
ProxyImpl.java(プロキシの実装クラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package proxy; public class ProxyImpl implements ProxyTest { ProxyTest proxytest; ProxyImpl(ProxyTest proxytest){ this.proxytest = proxytest; } public void MethodA() { System.out.println("処理を開始します。"); proxytest.MethodA(); System.out.println("処理を終了します。"); } } |
実行結果
プロキシの適用後では、処理が追加されていることがわかります。
この記事へのコメントはありません。