nono blog
楽しい人生を送りたい!
ITスキル

pythonプログラム デザインパターン(Proxy)

構造パターンの一つである、Proxyパターンについて

Proxyパターンについて

Proxy :代理を表す。
あるオブジェクトの代わりに処理を行う。
オリジナルのオブジェクトへのアクセスをコントロールしたい場合に用いられる。
(例)
・インスタンス化する際に、時間がかかる場合
・処理が複雑、危険な処理がありチェックをしたい場合にProxyが用いられる

クレジットカード(現金の代理処理) ⇆  現金

(目的)
特定のオブジェクトに変わって処理を行う

(仕組み)
Subjectを継承したRealSubjectに処理を記述する。
Subjectを継承したProxyを作成して、RealSubjectの代わりに処理を行う

(構成要素)
Subject : RealSubject と Proxy を同一視して利用するためのインターフェース
RealSubject : Subject を継承して処理を記述する
Proxy : RealSubject の代わりにクライアントからの処理を返す。
自分で処理ができなかった場合にRealSubjectを呼び出す

サンプルコード

Pythonによる、Proxyパターンのサンプルコードについて

# proxy.py

from abc import ABC, abstractmethod
import time


# Subject
class APICaller(ABC):

    @abstractmethod
    def request(self):
        pass


# RealSubject
class RealAPICaller():

    """重い処理のコンストラクタと想定する"""
    def __init__(self, url):
        self.__url = url
        time.sleep(5)

    def request(self):
        print('APIを呼び出す')
        return


class RealAPICallerProxy(APICaller):

    def __init__(self, url):
        self.__url = url

    def __check_access(self):
        print('Success')
        return True

    def __write_log(self):
        print('print logs')

    def request(self):
        if self.__check_access():
            real_api_caller = RealAPICaller(self.__url)
            real_api_caller.request()
            self.__write_log()


if __name__ == '__main__':
    caller = RealAPICaller('http://api.com')
    caller.request()

    print('*'*10)
    proxy = RealAPICallerProxy('https://api.com')
    proxy.request()