Python使用設(shè)計模式中的責(zé)任鏈模式與迭代器模式的示例
責(zé)任鏈模式
責(zé)任鏈模式:將能處理請求的對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理請求為止,避免請求的發(fā)送者和接收者之間的耦合關(guān)系。
#encoding=utf-8
#
#by panda
#職責(zé)連模式
def printInfo(info):
print unicode(info, 'utf-8').encode('gbk')
#抽象職責(zé)類
class Manager():
successor = None
name = ''
def __init__(self, name):
self.name = name
def SetSuccessor(self, successor):
self.successor = successor
def HandleRequest(self, request):
pass
#具體職責(zé)類:經(jīng)理
class CommonManager(Manager):
def HandleRequest(self, request):
if request.RequestType == '請假' and request.Number <= 2:
printInfo('%s:%s 數(shù)量%d 被批準(zhǔn)' % (self.name, request.RequestContent, request.Number))
else:
if self.successor != None:
self.successor.HandleRequest(request)
#具體職責(zé)類:總監(jiān)
class Majordomo(Manager):
def HandleRequest(self, request):
if request.RequestType == '請假' and request.Number <= 5:
printInfo('%s:%s 數(shù)量%d 被批準(zhǔn)' % (self.name, request.RequestContent, request.Number))
else:
if self.successor != None:
self.successor.HandleRequest(request)
#具體職責(zé)類:總經(jīng)理
class GeneralManager(Manager):
def HandleRequest(self, request):
if request.RequestType == '請假':
printInfo('%s:%s 數(shù)量%d 被批準(zhǔn)' % (self.name, request.RequestContent, request.Number))
elif request.RequestType == '加薪' and request.Number <= 500:
printInfo('%s:%s 數(shù)量%d 被批準(zhǔn)' % (self.name, request.RequestContent, request.Number))
elif request.RequestType == '加薪' and request.Number > 500:
printInfo('%s:%s 數(shù)量%d 再說吧' % (self.name, request.RequestContent, request.Number))
class Request():
RequestType = ''
RequestContent = ''
Number = 0
def clientUI():
jinLi = CommonManager('金力')
zongJian = Majordomo('宗健')
zhongJingLi = GeneralManager('鐘金利')
jinLi.SetSuccessor(zongJian)
zongJian.SetSuccessor(zhongJingLi)
request = Request()
request.RequestType = '請假'
request.RequestContent = '小菜請假'
request.Number = 1
jinLi.HandleRequest(request)
request.RequestType = '請假'
request.RequestContent = '小菜請假'
request.Number = 5
jinLi.HandleRequest(request)
request.RequestType = '加薪'
request.RequestContent = '小菜要求加薪'
request.Number = 500
jinLi.HandleRequest(request)
request.RequestType = '加薪'
request.RequestContent = '小菜要求加薪'
request.Number = 1000
jinLi.HandleRequest(request)
return
if __name__ == '__main__':
clientUI();
類圖:

迭代器模式
迭代器模式:提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內(nèi)部表示。
python內(nèi)置支持這種模式,所以一般來說,不用自己寫,
#encoding=utf-8
#
#by panda
#迭代器(Iterator)模式
def printInfo(info):
print unicode(info, 'utf-8').encode('gbk')
#迭代器抽象類
class Iterator:
def First(self):
pass
def Next(self):
pass
def IsDone(self):
pass
def CurrentItem(self):
pass
#集合抽象類
class Aggregate:
def CreateIterator(self):
pass
#具體迭代器類:
class ConcreteIterator(Iterator):
aggregate = None
current = 0
def __init__(self, aggregate):
self.aggregate = aggregate
self.current = 0
def First(self):
return self.aggregate[0]
def Next(self):
ret = None
self.current += 1
if(self.current < len(self.aggregate)):
ret = self.aggregate[self.current]
return ret
def IsDone(self):
if(self.current < len(self.aggregate)):
return False
else:
return True
def CurrentItem(self):
ret = None
if(self.current < len(self.aggregate)):
ret = self.aggregate[self.current]
return ret
#具體集合類
class ConcreteAggregate(Aggregate):
items = None
def __init__(self):
self.items = []
def clientUI():
a = ConcreteAggregate()
a.items.append('大鳥')
a.items.append('小菜')
a.items.append('行李')
a.items.append('老外')
a.items.append('公交內(nèi)部員工')
a.items.append('小偷')
printInfo('---------迭代器模式-------------')
i = ConcreteIterator(a.items)
item = i.First()
while(False == i.IsDone()):
printInfo("%s 請買車票!" % i.CurrentItem());
i.Next()
printInfo('\n---------python內(nèi)部迭代-------------')
for item in a.items:
printInfo("%s 請買車票!" % item);
return
if __name__ == '__main__':
clientUI();
類圖:

相關(guān)文章
python如何實現(xiàn)單向鏈表及單向鏈表的反轉(zhuǎn)
這篇文章主要介紹了python如何實現(xiàn)單向鏈表及單向鏈表的反轉(zhuǎn),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
Python利用pandas和matplotlib實現(xiàn)繪制雙柱狀圖
在數(shù)據(jù)分析和可視化中,常用的一種圖形類型是柱狀圖,柱狀圖能夠清晰地展示不同分類變量的數(shù)值,并支持多組數(shù)據(jù)進行對比,本篇文章將介紹python如何使用pandas和matplotlib繪制雙柱狀圖,需要的可以參考下2023-11-11
基于python+selenium的二次封裝的實現(xiàn)
這篇文章主要介紹了基于python+selenium的二次封裝的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
python flask框架實現(xiàn)傳數(shù)據(jù)到j(luò)s的方法分析
這篇文章主要介紹了python flask框架實現(xiàn)傳數(shù)據(jù)到j(luò)s的方法,結(jié)合實例形式分析了前端數(shù)據(jù)序列化及后臺Flask交互數(shù)據(jù)返回相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
淺談keras中l(wèi)oss與val_loss的關(guān)系
這篇文章主要介紹了淺談keras中l(wèi)oss與val_loss的關(guān)系,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
使用fdopen實現(xiàn)對Python進程產(chǎn)生的文件進行權(quán)限最小化配置
用python進行文件的創(chuàng)建和讀寫操作時,我們很少關(guān)注所創(chuàng)建的文件的權(quán)限配置。本文就來聊聊如何使用fdopen實現(xiàn)對Python進程產(chǎn)生的文件進行權(quán)限最小化配置吧2023-03-03

