Python的組合模式與責(zé)任鏈模式編程示例
組合模式
我們把Composite模式看成一個(gè)復(fù)雜的屬性結(jié)構(gòu),其實(shí)基本有三種角色:樹(shù)干(定義一些操作樹(shù)葉leaf的操作),樹(shù)枝(樹(shù)干上有很多樹(shù)枝)和樹(shù)葉(樹(shù)干想要具體操作的對(duì)象) ,Composite模式幫我們實(shí)現(xiàn):即它們?cè)诔洚?dāng)對(duì)象的時(shí)候,還是其他對(duì)象的容易,從而提供一致性
python的例子
class Trunk(object):
'''樹(shù)干'''
def __str__(self):
pass
def subtree(self):
pass
class Composite(Trunk):
def __init__(self, left=None, right=None, length=None):
self.left=left
self.right=right
self.length=length
def __str__(self):
# 這個(gè)結(jié)果是在調(diào)用subtree()的時(shí)候返回
if self.length:
return "(" + self.left.__str__() + ", " + self.right.__str__() + ")" + ": " + str(self.length)
else:
return "(" + self.left.__str__() + ", " + self.right.__str__() + ")"
# 這里其實(shí)就是一個(gè)技巧,通過(guò)這個(gè)函數(shù)返回下一級(jí)的對(duì)象,也就是它既是對(duì)象還可以是對(duì)象的容器
def subtree(self):
return Composite(self.left, self.right)
class Leaf(Trunk):
'''葉子類(lèi),它沒(méi)辦法繼續(xù)延伸了'''
def __init__(self, name, length=None):
self.name = name
self.length=length
self.left = None
self.right = None
def __str__(self):
return self.name + ": " + str(self.length)
def subtree(self):
return Leaf(self.name, self.length)
if __name__ == "__main__":
# 只有葉子那么就直接返回__str__的拼裝結(jié)果
t1 = Leaf('A', 0.71399)
print t1
# 有個(gè)2個(gè)葉子的組合,返回的是2個(gè)葉子的對(duì)象的組合
t2 = Composite(Leaf('B', -0.00804),
Leaf('C', 0.07470))
print t2
# 這個(gè)是嵌套的葉子的組合,樹(shù)干上面有樹(shù)枝,樹(shù)枝上面有葉子
t3 = Composite(Leaf('A', 0.71399),
Composite(Leaf('B', -0.00804),
Leaf('C', 0.07470), 0.1533), 0.0666)
print t3
# 直接通過(guò)左右節(jié)點(diǎn)找到對(duì)應(yīng)的葉子對(duì)象了
t4 = t3.right.right.subtree()
print t4
# t3的左樹(shù)其實(shí)就是葉子對(duì)象了
t5 = t3.left.subtree()
print t5
責(zé)任鏈模式
比如我們還在讀書(shū)的時(shí)候,考試的分?jǐn)?shù)都是幾個(gè)檔次,比如90-100分,80-90分,好吧我想做一個(gè)根據(jù)分?jǐn)?shù)打印你的學(xué)習(xí)成績(jī)的反饋, 比如90-100就是A+,80-90就是A,70-80就是B+… 當(dāng)然你可以用很多種方法實(shí)現(xiàn),我這里就來(lái)實(shí)現(xiàn)一個(gè)Chain模式:用一系列的類(lèi)來(lái)響應(yīng), 但只有遇到適合處理它的類(lèi)才會(huì)處理,類(lèi)似與case和switch的作用
python的例子
class BaseHandler:
# 它起到了鏈的作用
def successor(self, successor):
self.successor = successor
class ScoreHandler1(BaseHandler):
def handle(self, request):
if request > 90 and request <= 100:
return "A+"
else:
# 否則傳給下一個(gè)鏈,下同,但是我是要return回結(jié)果的
return self.successor.handle(request)
class ScoreHandler2(BaseHandler):
def handle(self, request):
if request > 80 and request <= 90:
return "A"
else:
return self.successor.handle(request)
class ScoreHandler3(BaseHandler):
def handle(self, request):
if request > 70 and request <= 80:
return "B+"
else:
return "unsatisfactory result"
class Client:
def __init__(self):
h1 = ScoreHandler1()
h2 = ScoreHandler2()
h3 = ScoreHandler3()
# 注意這個(gè)順序,h3包含一個(gè)類(lèi)似于default結(jié)果的東西,是要放在最后的,其他的順序是無(wú)所謂的,比如h1和h2
h1.successor(h2)
h2.successor(h3)
requests = {'zhangsan': 78,
'lisi': 98,
'wangwu': 82,
'zhaoliu': 60}
for name, score in requests.iteritems():
print '{} is {}'.format(name, h1.handle(score))
if __name__== "__main__":
client = Client()
相關(guān)文章
Django通過(guò)dwebsocket實(shí)現(xiàn)websocket的例子
今天小編就為大家分享一篇Django通過(guò)dwebsocket實(shí)現(xiàn)websocket的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python 對(duì)輸入的數(shù)字進(jìn)行排序的方法
今天小編就為大家分享一篇Python 對(duì)輸入的數(shù)字進(jìn)行排序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
完美解決python遍歷刪除字典里值為空的元素報(bào)錯(cuò)問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決python遍歷刪除字典里值為空的元素報(bào)錯(cuò)問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
使用Python和Selenium構(gòu)建一個(gè)自動(dòng)化圖像引擎
這篇文章主要為大家詳細(xì)介紹了如何使用Python和Selenium庫(kù)構(gòu)建一個(gè)自動(dòng)化圖像引擎,能夠根據(jù)指定參數(shù)自動(dòng)截取網(wǎng)頁(yè)快照,并將生成的圖片存儲(chǔ)到云端,需要的可以參考下2024-12-12
django2用iframe標(biāo)簽完成網(wǎng)頁(yè)內(nèi)嵌播放b站視頻功能
這篇文章主要介紹了django2 用iframe標(biāo)簽完成 網(wǎng)頁(yè)內(nèi)嵌播放b站視頻功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
linux之父進(jìn)程使用kill函數(shù)殺死子進(jìn)程方式
這篇文章主要介紹了linux之父進(jìn)程使用kill函數(shù)殺死子進(jìn)程方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python神經(jīng)網(wǎng)絡(luò)使用tensorflow構(gòu)建長(zhǎng)短時(shí)記憶LSTM
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)tensorflow構(gòu)建長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)LSTM,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

