Python使用設計模式中的責任鏈模式與迭代器模式的示例
責任鏈模式
責任鏈模式:將能處理請求的對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理請求為止,避免請求的發(fā)送者和接收者之間的耦合關系。
#encoding=utf-8 # #by panda #職責連模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #抽象職責類 class Manager(): successor = None name = '' def __init__(self, name): self.name = name def SetSuccessor(self, successor): self.successor = successor def HandleRequest(self, request): pass #具體職責類:經(jīng)理 class CommonManager(Manager): def HandleRequest(self, request): if request.RequestType == '請假' and request.Number <= 2: printInfo('%s:%s 數(shù)量%d 被批準' % (self.name, request.RequestContent, request.Number)) else: if self.successor != None: self.successor.HandleRequest(request) #具體職責類:總監(jiān) class Majordomo(Manager): def HandleRequest(self, request): if request.RequestType == '請假' and request.Number <= 5: printInfo('%s:%s 數(shù)量%d 被批準' % (self.name, request.RequestContent, request.Number)) else: if self.successor != None: self.successor.HandleRequest(request) #具體職責類:總經(jīng)理 class GeneralManager(Manager): def HandleRequest(self, request): if request.RequestType == '請假': printInfo('%s:%s 數(shù)量%d 被批準' % (self.name, request.RequestContent, request.Number)) elif request.RequestType == '加薪' and request.Number <= 500: printInfo('%s:%s 數(shù)量%d 被批準' % (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();
類圖:
相關文章
python連接sql?server數(shù)據(jù)庫的方法實戰(zhàn)
當我們用Python來編寫網(wǎng)站,必須要能夠通過python操作數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關于python連接sql?server數(shù)據(jù)庫的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-08-08Python中字節(jié)數(shù)組和16進制字符串轉(zhuǎn)換方式
這篇文章主要介紹了Python中字節(jié)數(shù)組和16進制字符串轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Python 的 __str__ 和 __repr__ 方法對比
這篇文章主要介紹了Python 的 __str__ 和 __repr__ 方法的相關資料,幫助大家區(qū)分__str__ 和 __repr__ ,感興趣的朋友可以了解下2020-09-09django創(chuàng)建最簡單HTML頁面跳轉(zhuǎn)方法
今天小編就為大家分享一篇django創(chuàng)建最簡單HTML頁面跳轉(zhuǎn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08pytorch實現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例)
今天小編就為大家分享一篇pytorch實現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python生產(chǎn)者與消費者模型中的優(yōu)勢介紹
這篇文章主要介紹了python多進程中的生產(chǎn)者和消費者模型優(yōu)勢,生產(chǎn)者是指生產(chǎn)數(shù)據(jù)的任務,消費者是指消費數(shù)據(jù)的任務。當生產(chǎn)者的生產(chǎn)能力遠大于消費者的消費能力,生產(chǎn)者就需要等消費者消費完才能繼續(xù)生產(chǎn)新的數(shù)據(jù)2023-03-03