構造パターンの一つである、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()