Proxyパターンもそんなに難しくないですね。RealSubject役がProxy役を意識しないところが味噌ですね。
- Virtual Proxy ... 今回の例
- Remote Proxy ... ネットワーク越しのメソッド呼び出しに
- Access Proxy ... メソッド呼び出しにアクセス制限を設けたい時に
timeモジュールのsleep(sec)はスレッドをブロックするので、マルチスレッド化しなければsynchronizeを意識する必要はなさそうです。
実行結果
名前は現在Aliceです。 名前は現在Bobです。 Printerのインスタンス(Bob)を生成中 生成完了 === Bob === Hello, world
ソースコード
#!/usr/bin/env python
# -*- coding: utf8 -*-
# Subject interface
class __Printable:
def __init__(self): raise NotImplementedError
def setPrinterName(self, n): raise NotImplementedError
def getPrinterName(self): raise NotImplementedError
def printIt(self): raise NotImplementedError
from time import sleep
# RealSubject class
class Printer(__Printable):
def __init__(self, name):
self.__name = name
print "Printerのインスタンス(%s)を生成中" % name
self.__heavyjob()
def getPrinterName(self):
return self.__name
def setPrinterName(self, n):
self.__name = n
def printIt(self, msg):
print "=== %s ===" % self.__name
print msg
def __heavyjob(self):
sleep(3)
print '生成完了'
# Proxy class
class PrinterProxy(__Printable):
def __init__(self, name):
self.__name = name
self.__real = None
def getPrinterName(self):
return self.__name
def setPrinterName(self, n):
self.__name = n
if not self.__real == None:
self.__real.setPrinterName(n)
def printIt(self, msg):
if self.__real == None:
self.__realize()
self.__real.printIt(msg)
def __realize(self):
self.__real = Printer(self.__name)
# Client
def main():
m_printer = PrinterProxy("Alice")
print "名前は現在%sです。" % m_printer.getPrinterName()
m_printer.setPrinterName("Bob")
print "名前は現在%sです。" % m_printer.getPrinterName()
m_printer.printIt("Hello, world")
if __name__=='__main__': main()
0 件のコメント:
コメントを投稿