🦚

Proxy

2023/09/10に公開

Proxy パターンは、別のオブジェクトへのアクセスを制御するための代理または置き換えオブジェクトを提供するデザインパターンです。プロキシは元のオブジェクトと同じインターフェースを持っており、クライアントはプロキシを通じて元のオブジェクトにアクセスします。

主要な構成要素:

  1. Subject (対象): RealSubject と Proxy が共有するインターフェースや抽象クラス。
  2. RealSubject (実対象): Proxy が代表する実際のオブジェクト。
  3. Proxy (代理): RealSubject へのアクセスを制御するオブジェクト。

例:

データベースへのアクセスを制御するプロキシを考えてみましょう。このプロキシは、データベースへの実際の接続を遅延させたり、アクセスの頻度を制限したりすることができます。

  1. Subject:

    from abc import ABC, abstractmethod
    
    class Database(ABC):
        @abstractmethod
        def request(self):
            pass
    
    
  2. RealSubject:

    class RealDatabase(Database):
        def request(self):
            print("RealDatabase: Handling the request.")
    
    
  3. Proxy:

    class DatabaseProxy(Database):
        def __init__(self):
            self._database = None
    
        def request(self):
            if not self._database:
                self._database = RealDatabase()
            print("Proxy: Forwarding the request to the RealDatabase.")
            self._database.request()
    
    

使用方法:

    proxy = DatabaseProxy()
    proxy.request()  # 初回は実際のデータベース接続が行われる
    proxy.request()  # 二回目は既存の接続を再利用する

利点:

  1. 制御の追加: オブジェクトへのアクセスを制御、ログ、キャッシュなどの追加機能を提供することができます。
  2. 遅延初期化: リソースが高価なオブジェクトの作成を遅延させることができます。
  3. アクセスの制限: 特定の操作やアクセスに制限を加えることができます。

Proxy パターンは、アクセスを制御したり、追加の機能を提供したりするために、特定のオブジェクトへのアクセスを代理で行う場面で利用されます。

Discussion