Python使用設(shè)計(jì)模式中的責(zé)任鏈模式與迭代器模式的示例
責(zé)任鏈模式
責(zé)任鏈模式:將能處理請求的對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個(gè)對象處理請求為止,避免請求的發(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();
類圖:

迭代器模式
迭代器模式:提供一種方法順序訪問一個(gè)聚合對象中的各個(gè)元素,而又不暴露該對象的內(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連接sql?server數(shù)據(jù)庫的方法實(shí)戰(zhàn)
當(dāng)我們用Python來編寫網(wǎng)站,必須要能夠通過python操作數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于python連接sql?server數(shù)據(jù)庫的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Python中字節(jié)數(shù)組和16進(jìn)制字符串轉(zhuǎn)換方式
這篇文章主要介紹了Python中字節(jié)數(shù)組和16進(jìn)制字符串轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python 的 __str__ 和 __repr__ 方法對比
這篇文章主要介紹了Python 的 __str__ 和 __repr__ 方法的相關(guān)資料,幫助大家區(qū)分__str__ 和 __repr__ ,感興趣的朋友可以了解下2020-09-09
django創(chuàng)建最簡單HTML頁面跳轉(zhuǎn)方法
今天小編就為大家分享一篇django創(chuàng)建最簡單HTML頁面跳轉(zhuǎn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例)
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
python操作手機(jī)app的實(shí)現(xiàn)步驟
本文主要介紹了python操作手機(jī)app的實(shí)現(xiàn)步驟,本文將結(jié)合實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Python生產(chǎn)者與消費(fèi)者模型中的優(yōu)勢介紹
這篇文章主要介紹了python多進(jìn)程中的生產(chǎn)者和消費(fèi)者模型優(yōu)勢,生產(chǎn)者是指生產(chǎn)數(shù)據(jù)的任務(wù),消費(fèi)者是指消費(fèi)數(shù)據(jù)的任務(wù)。當(dāng)生產(chǎn)者的生產(chǎn)能力遠(yuǎn)大于消費(fèi)者的消費(fèi)能力,生產(chǎn)者就需要等消費(fèi)者消費(fèi)完才能繼續(xù)生產(chǎn)新的數(shù)據(jù)2023-03-03

