「代理のオブジェクトを使うことでいろいろメリットがあるパターン」です。
このパターンを使うことで
などを実現することができます。
ここでは、プレーンなProxyパターンを作っていきます。
稟議の仕組みを考えます。
# 承認者 → approver
# 部長 → Director
# 課長 → SectionChief
# としました。
from time import sleep
def main():
sectionchief = SectionChief()
print(sectionchief.approve_100yen()) # => OK
print(sectionchief.approve_3000yen()) # => OK
# Subject
class Approver:
def approve_100yen(self):
raise NotImplementedError("abstract method")
def approve_3000yen(self):
raise NotImplementedError("abstract method")
# Real subject(主体者)
class Director(Approver):
def approve_100yen(self):
sleep(10)
return "OK"
def approve_3000yen(self):
sleep(10)
return "OK"
# Proxy
class SectionChief(Approver):
def approve_100yen(self):
return "OK"
def approve_3000yen(self):
return Director().approve_3000yen()
if __name__ == "__main__":
main()
2回目のOKは10秒ほど待つと出てきます。
まず、ユーザー視点から見ていきます。
def main():
sectionchief = SectionChief()
print(sectionchief.approve_100yen()) # => OK
print(sectionchief.approve_3000yen()) # => OK
ユーザーはProxyにrequestを投げるだけでOKです。
次にProxy視点を見ます。
# Proxy
class SectionChief(Approver):
def approve_100yen(self):
return "OK"
def approve_3000yen(self):
return Director().approve_3000yen()
Proxyはできる仕事は自分で行い(approve_100yen
)、
自分にできない仕事(approve_3000yen
)はできる人(Real subject; Director
)に投げます。
こうすることで処理の重いReal subjectの負担を軽減することができます。
特になし