Proxy パターン

「Proxy」という英単語は、「代理人」を意味します。

このパターンは、本人の代理人となるオブジェクトが本人でなくともできる処理を受持ち、「どうしても本人でないと・・・」という場合のみ、本人に処理を任せるというパターンです。

このパターンは、「Decorator」パターンと酷似していますが、それぞれ目的が異なっています。「Decorator」パターンの目的は、新しい機能を追加するための工夫であり、「Proxy」パターンの目的は、あるオブジェクトへの負荷を軽減(そのために代理して処理を実施)するための工夫となります。


役割り

1. Subject(主体・本人)
「Proxy」と「RealSubject」の共通のインタフェースを定義します。上記により、双方のクラスを同一視でき、同じメソッドで「Proxy」が肩代わりできます。
2. Proxy(代理人)
「Subject」のインタフェースを実装します。「Client」からの要求を可能な限り処理しますが、どうしても自分で処理できない場合は、「RealSubject」に処理を委任します。
※「Proxy」は、どうしても「RealSubject」が必要になった時点で、「RealSubject」オブジェクトを生成し、処理を委任します。
3. RealSubject(真の主体・本人)
「Subject」のインタフェースを実装します。「Proxy」では、どうしも処理できない場合に、「Proxy」から処理を委任されます。
4. Client(利用者)
「Proxy」パターンを適用したクラスを利用し処理します。

▲PageTop

クラス図

Proxyパターンのクラス図

Proxyパターン クラス図

▲PageTop

サンプル

ソースコード

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()
        

▲PageTop