Python設(shè)計(jì)模式結(jié)構(gòu)型組合模式
一、組合模式
組合,將多個(gè)對(duì)象組合成為一個(gè)樹(shù)狀結(jié)構(gòu),來(lái)表示業(yè)務(wù)邏輯上的層次。組合模式使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
比如,描述一家公司的層次結(jié)構(gòu),那么我們用辦公室來(lái)表示節(jié)點(diǎn),則總經(jīng)理辦公司是根節(jié)點(diǎn),下面分別由人事辦公室、業(yè)務(wù)辦公室、生產(chǎn)辦公室、財(cái)務(wù)辦公室,每個(gè)辦公室下面可以還有跟小的辦公室,每個(gè)辦公室都有職責(zé)、人員數(shù)、人員薪資等屬性;
優(yōu)點(diǎn):
- 定義了包含基本對(duì)象和組合對(duì)象的類(lèi)層次結(jié)構(gòu)。
- 簡(jiǎn)化
Client
代碼,即Client
可以一致地使用組合對(duì)象和單個(gè)對(duì)象。 - 更容易增加新類(lèi)型的組件。
二、應(yīng)用場(chǎng)景
用于設(shè)計(jì)一個(gè)有層次等級(jí)的系統(tǒng),并處理各層次之間的關(guān)系。
三、代碼示例
實(shí)體角色:
- 抽象組件(
Component
) - 葉子組件(
Leaf
) - 復(fù)合組件(
Composite
) - 客戶(hù)端(
Client
)
class ComponentBase: ? ? """部門(mén)抽象出來(lái)的基類(lèi)""" ? ? def __init__(self, name): ? ? ? ? slef.name = name ? ? def add(self, obj): ? ? ? ? pass ? ? def remove(self, obj): ? ? ? ? pass ? ? def display(self, number): ? ? ? ? pass class Node(ComponentBase): ? ? def __init__(self, name, duty): ? ? ? ? self.name = name ? ? ? ? self.duty = duty ? ? ? ? self.children = [] ? ? def add(self, obj): ? ? ? ? self.children.append(obj) ? ? def remove(self, obj): ? ? ? ? self.children.remove(obj) ? ? def display(self, number=1): ? ? ? ? print("部門(mén):{} 級(jí)別:{} 職責(zé):{}".format(self.name, number, self.duty)) ? ? ? ? n = number+1 ? ? ? ? for obj in self.children: ? ? ? ? ? ? obj.display(n) if __name__ == '__main__': ? ? root = Node("總經(jīng)理辦公室", "總負(fù)責(zé)人") ? ? node1 = Node("財(cái)務(wù)部門(mén)", "公司財(cái)務(wù)管理") ? ? root.add(node1) ? ? node2 = Node("業(yè)務(wù)部門(mén)", "銷(xiāo)售產(chǎn)品") ? ? root.add(node2) ? ? node3 = Node("生產(chǎn)部門(mén)", "生產(chǎn)產(chǎn)品") ? ? root.add(node3) ? ? node4 = Node("銷(xiāo)售事業(yè)一部門(mén)", "A產(chǎn)品銷(xiāo)售") ? ? node2.add(node4) ? ? node5 = Node("銷(xiāo)售事業(yè)二部門(mén)", "B產(chǎn)品銷(xiāo)售") ? ? node2.add(node5) ? ? root.display()
到此這篇關(guān)于Python設(shè)計(jì)模式結(jié)構(gòu)型組合模式的文章就介紹到這了,更多相關(guān)Python組合模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)Appium端口檢測(cè)與釋放的實(shí)現(xiàn)
這篇文章主要介紹了Python實(shí)現(xiàn)Appium端口檢測(cè)與釋放的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12基于Flask+websocket實(shí)現(xiàn)一個(gè)在線(xiàn)聊天室
在今天的互聯(lián)網(wǎng)時(shí)代,實(shí)時(shí)通信成為了許多應(yīng)用和服務(wù)的核心特色,在本文中,我們將介紹如何使用 Flask 和 Websockets 通過(guò) Flask-SocketIO 框架創(chuàng)建一個(gè)簡(jiǎn)單的在線(xiàn)聊天室,感興趣的可以跟隨小編一起了解下2023-09-09python數(shù)字圖像處理之對(duì)比度與亮度調(diào)整示例
這篇文章主要為大家介紹了python數(shù)字圖像處理之對(duì)比度與亮度調(diào)整示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06在ipython notebook中使用argparse方式
這篇文章主要介紹了在ipython notebook中使用argparse方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Django 權(quán)限管理(permissions)與用戶(hù)組(group)詳解
這篇文章主要介紹了Django 權(quán)限管理(permissions)與用戶(hù)組(group)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11常見(jiàn)的在Python中實(shí)現(xiàn)單例模式的三種方法
這篇文章主要介紹了常見(jiàn)的在Python中實(shí)現(xiàn)單例模式的三種方法,單例模式在各個(gè)編程語(yǔ)言的學(xué)習(xí)中都是需要掌握的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-04-04Python 通過(guò)打碼平臺(tái)實(shí)現(xiàn)驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了Python 通過(guò)打碼平臺(tái)實(shí)現(xiàn)驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python中實(shí)現(xiàn)對(duì)Timestamp和Datetime及UTC時(shí)間之間的轉(zhuǎn)換
這篇文章主要介紹了Python中實(shí)現(xiàn)對(duì)Timestamp和Datetime及UTC時(shí)間之間的轉(zhuǎn)換,例子則主要針對(duì)Ubuntu等類(lèi)UNIX系統(tǒng),需要的朋友可以參考下2015-04-04