Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [㉑ Proxy]

概要

proxyは日本語で「代理人」という意味になる.Proxyパターンは,オリジナルのオブジェクトへのアクセスを制御するための代理オブジェクトを提供し,オリジナルでなくても可能な処理を代理オブジェクトに任せ,代理オブジェクトで不可能な処理をオリジナルオブジェクトが処理するパターンである.

Proxyパターンの主な要素は以下である.

  • Subject:RealSubjectとProxyに共通のインターフェース
  • RealSubject:Subjectを実装したオリジナルのオブジェクト
  • Proxy:Subjectを実装した代理オブジェクト

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

java// Subject
interface Subject {
    void operation();
}

// Real Subject
class RealSubject implements Subject {
    @Override
    public void operation() {
        System.out.println("RealSubject operation");
    }
}

// Proxy
class Proxy implements Subject {
    private Subject subject;
    private String sentence;
    public Proxy(Subject subject) {
        this.subject = subject;
    }
    @Override
    public void operation() {
        if (sentence == null) {
            subject.operation();
            sentence = "Proxy operation";
        } else {
            System.out.println(sentence);
        }
    }
}

// Client
public class ProxyPattern {
    public static void main(String[] args) {
        Subject subject = new Proxy(new RealSubject());
        subject.operation();
        subject.operation();
        subject.operation();
    }
}

まとめ,所感

プロキシを追加することによって,利用者からみたメソッドの使い方を変えずに,特定の振る舞いを拡張させることができる.

これと逆?になるのがDecoratorで,Decoratorパターンは既存メソッドの振る舞いはそのままにして,新たなメソッドの追加を行っている.