代理设计模式
代理设计模式包含一个新对象,称为“代理”,代替被称为“真实主体”的现有对象。 由真实主体创建的代理对象必须位于相同的接口上,以便不让客户端知道使用代理来代替真实对象。 客户端向代理生成的请求将通过真实主体传递。
代理模式的UML表示如下 -
如何实现代理模式?
现在让我们来看看如何实现代理模式。参考以下实现代码
class Image:
def __init__( self, filename ):
self._filename = filename
def load_image_from_disk( self ):
print("loading " + self._filename )
def display_image( self ):
print("display " + self._filename)
class Proxy:
def __init__( self, subject ):
self._subject = subject
self._proxystate = None
class ProxyImage( Proxy ):
def display_image( self ):
if self._proxystate == None:
self._subject.load_image_from_disk()
self._proxystate = 1
print("display " + self._subject._filename )
proxy_image1 = ProxyImage ( Image("HiRes_10Mb_Photo1") )
proxy_image2 = ProxyImage ( Image("HiRes_10Mb_Photo2") )
proxy_image1.display_image() # loading necessary
proxy_image1.display_image() # loading unnecessary
proxy_image2.display_image() # loading necessary
proxy_image2.display_image() # loading unnecessary
proxy_image1.display_image() # loading unnecessar
执行上述程序生成以下输出 -
代理模式设计有助于复制创建的图像。 display_image()函数有助于检查值是否在命令提示符下打印。
责任链设计模式
责任链模式用于实现软件中的松散耦合,其中来自客户端的指定请求通过包含在其中的对象链传递。 它有助于构建一系列对象。 请求从一端进入并从一个对象移动到另一个对象。
该模式允许对象发送命令而不知道哪个对象将处理该请求。
如何实现责任链模式?
现在我们将看到如何实施责任链模式。参考以下实现代码
class ReportFormat(object):
PDF = 0
TEXT = 1
class Report(object):
def __init__(self, format_):
self.title = 'Monthly report'
self.text = ['Things are going', 'really, really well.']
self.format_ = format_
class Handler(object):
def __init__(self):
self.nextHandler = None
def handle(self, request):
self.nextHandler.handle(request)
class PDFHandler(Handler):
def handle(self, request):
if request.format_ == ReportFormat.PDF:
self.output_report(request.title, request.text)
else:
super(PDFHandler, self).handle(request)
def output_report(self, title, text):
print '<html>'
print ' <head>'
print ' <title>%s</title>' % title
print ' </head>'
print ' <body>'
for line in text:
print ' <p>%s
' % line
print ' </body>'
print '</html>'
class TextHandler(Handler):
def handle(self, request):
if request.format_ == ReportFormat.TEXT:
self.output_report(request.title, request.text)
else:
super(TextHandler, self).handle(request)
def output_report(self, title, text):
print 5*'*' + title + 5*'*'
for line in text:
print line
class ErrorHandler(Handler):
def handle(self, request):
print "Invalid request"
if __name__ == '__main__':
report = Report(ReportFormat.TEXT)
pdf_handler = PDFHandler()
text_handler = TextHandler()
pdf_handler.nextHandler = text_handler
text_handler.nextHandler = ErrorHandler()
pdf_handler.handle(report)
执行上述程序生成以下输出 -
解释说明
上面的代码是创建一个报告的月任务,通过每个函数发送命令。 它需要两个处理程序 - 用于PDF和文本。 当所需的对象执行每个功能,它将打印输出