「Proxy」という英単語は、「代理人」を意味します。
このパターンは、本人の代理人となるオブジェクトが本人でなくともできる処理を受持ち、「どうしても本人でないと・・・」という場合のみ、本人に処理を任せるというパターンです。
このパターンは、「Decorator」パターンと酷似していますが、それぞれ目的が異なっています。「Decorator」パターンの目的は、新しい機能を追加するための工夫であり、「Proxy」パターンの目的は、あるオブジェクトへの負荷を軽減(そのために代理して処理を実施)するための工夫となります。
Proxyパターンのクラス図
1. Subject.java
public abstract class Subject { protected String name; public abstract void request1(String name); public abstract void request2(); public abstract void request3(); }
2. Proxy.java
public class Proxy extends Subject { RealSubject realSubject; public void request1(String name) { System.out.println("代理:Proxy-r1()"); super.name = name; } public void request2() { if (realSubject == null) { System.out.println("代理:Proxy-r2()"); } else { realSubject.request2(); } } public void request3() { System.out.println("代理:Proxy-r3()"); if (realSubject == null) { realSubject = new RealSubject(); realSubject.request1(name); } realSubject.request3(); } }
3. RealSubject.java
public class RealSubject extends Subject { public void request1(String name) { System.out.println("本人:RealSubject-r1()"); super.name = name; } public void request2() { System.out.println("本人:RealSubject-r2()"); } public void request3() { System.out.println("本人:RealSubject[" + name + "]-r3()"); } }
4. Client.java
public class Client { public static void main(String[] args) { Subject sub = new Proxy(); sub.request1("AAA"); sub.request2(); sub.request3(); } }
C:\sample\desin_pattern\proxy>javac Client.java [Enter] C:\sample\desin_pattern\proxy>java Client [Enter] 代理:Proxy-r1() 代理:Proxy-r2() 代理:Proxy-r3() 本人:RealSubject-r1() 本人:RealSubject[AAA]-r3()