責(zé)任鏈模式用于實(shí)現(xiàn)軟件中的松散耦合,其中來自客戶端的指定請(qǐng)求通過包含在其中的對(duì)象鏈傳遞。 它有助于構(gòu)建一系列對(duì)象。 請(qǐng)求從一端進(jìn)入并從一個(gè)對(duì)象移動(dòng)到另一個(gè)對(duì)象。
該模式允許對(duì)象發(fā)送命令而不知道哪個(gè)對(duì)象將處理該請(qǐng)求。
現(xiàn)在我們將看到如何實(shí)施責(zé)任鏈模式。參考以下實(shí)現(xiàn)代碼 -
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)
執(zhí)行上述程序生成以下輸出 -
解釋說明
上面的代碼是創(chuàng)建一個(gè)報(bào)告的月任務(wù),通過每個(gè)函數(shù)發(fā)送命令。 它需要兩個(gè)處理程序 - 用于PDF和文本。 當(dāng)所需的對(duì)象執(zhí)行每個(gè)功能,它將打印輸出。