Python使用設(shè)計(jì)模式中的責(zé)任鏈模式與迭代器模式的示例
責(zé)任鏈模式
責(zé)任鏈模式:將能處理請(qǐng)求的對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理請(qǐng)求為止,避免請(qǐng)求的發(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 == '請(qǐng)假' 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 == '請(qǐng)假' 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 == '請(qǐng)假': 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 = '請(qǐng)假' request.RequestContent = '小菜請(qǐng)假' request.Number = 1 jinLi.HandleRequest(request) request.RequestType = '請(qǐng)假' request.RequestContent = '小菜請(qǐng)假' 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è)聚合對(duì)象中的各個(gè)元素,而又不暴露該對(duì)象的內(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 請(qǐng)買車票!" % i.CurrentItem()); i.Next() printInfo('\n---------python內(nèi)部迭代-------------') for item in a.items: printInfo("%s 請(qǐng)買車票!" % item); return if __name__ == '__main__': clientUI();
類圖:
相關(guān)文章
python連接sql?server數(shù)據(jù)庫(kù)的方法實(shí)戰(zhàn)
當(dāng)我們用Python來編寫網(wǎng)站,必須要能夠通過python操作數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于python連接sql?server數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python中字節(jié)數(shù)組和16進(jìn)制字符串轉(zhuǎn)換方式
這篇文章主要介紹了Python中字節(jié)數(shù)組和16進(jìn)制字符串轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Python 的 __str__ 和 __repr__ 方法對(duì)比
這篇文章主要介紹了Python 的 __str__ 和 __repr__ 方法的相關(guān)資料,幫助大家區(qū)分__str__ 和 __repr__ ,感興趣的朋友可以了解下2020-09-09django創(chuàng)建最簡(jiǎn)單HTML頁(yè)面跳轉(zhuǎn)方法
今天小編就為大家分享一篇django創(chuàng)建最簡(jiǎn)單HTML頁(yè)面跳轉(zhuǎn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例)
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01python操作手機(jī)app的實(shí)現(xiàn)步驟
本文主要介紹了python操作手機(jī)app的實(shí)現(xiàn)步驟,本文將結(jié)合實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Python生產(chǎn)者與消費(fèi)者模型中的優(yōu)勢(shì)介紹
這篇文章主要介紹了python多進(jìn)程中的生產(chǎn)者和消費(fèi)者模型優(yōu)勢(shì),生產(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