プロキシパターン (Proxy Pattern)

📢 この記事は gemini-3-flash-preview によって翻訳されました

プロキシパターン (Proxy Pattern) オブジェクト構造型パターン

意図

他のオブジェクトへのアクセスをコントロールするために、そのオブジェクトの身代わり(代理人)を提供するよ。

構造

代理模式

役割分担はこんな感じ:

  • Proxy (代理人):実際のオブジェクト(RealSubject)への参照を持っていて、代理としてアクセスを受け付けるよ。Subject と同じインターフェースを持っているから、使う側は本物だと思って扱えるんだ。本物へのアクセスを制限したり、必要に応じて本物の生成や削除も担当するよ。
  • Subject (インターフェース):RealSubject と Proxy に共通のインターフェースを定義するよ。これがあるおかげで、RealSubject が必要な場所ならどこでも Proxy を代わりに使えるようになるんだ。
  • RealSubject (実体):Proxy が代理を務める、実際のオブジェクトだよ。

どんな時に使う?

単純なポインタよりも、もっと多機能だったり複雑な制御が必要な時にプロキシパターンが使われるよ。よくあるケースをいくつか紹介するね。

  • リモートプロキシ (Remote Proxy):別の場所に(別のサーバーとかに)あるオブジェクトを、まるで手元にあるかのように見せたい時に使うよ。
  • 仮想プロキシ (Virtual Proxy):作るのに時間がかかる重いオブジェクトを、本当に必要になるまで作らない(遅延生成)ようにする時に使うよ。
  • 保護プロキシ (Protection Proxy):アクセス権限をチェックして、元のオブジェクトを勝手に触られないようにガードしたい時に使うよ。
  • スマートリファレンス (Smart Reference):オブジェクトにアクセスする時に、ついでに何か処理をさせたい時に使うよ。例えば、参照カウンターを増やしたり、最初にアクセスした時にメモリにロードしたり、他の人が書き換えないようにロックをかけたりするんだ。

仲介業者が代わりに買い物をするイメージのコードだよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ProxyPattern {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);

        proxy.buy();
    }
}

interface Subject{
    public void buy();
}

class Proxy implements Subject{
    protected RealSubject realSubject;

    public Proxy(RealSubject realSubject){
        this.realSubject = realSubject;
    }

    @Override
    public void buy() {
        System.out.println("準備中...");
        realSubject.buy();
        System.out.println("完了!");
    }
}

class RealSubject implements Subject{

    @Override
    public void buy() {
        System.out.println("お金を払って購入");
    }
}

Visits Since 2025-02-28

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。