網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、組合模式
組合,將多個(gè)對(duì)象組合成為一個(gè)樹(shù)狀結(jié)構(gòu),來(lái)表示業(yè)務(wù)邏輯上的層次。組合模式使得用戶對(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
) - 客戶端(
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()
原文鏈接:https://is-cloud.blog.csdn.net/article/details/122933725
相關(guān)推薦
- 2022-01-06 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to
- 2022-09-23 Windows?10搭建FTP服務(wù)器圖文教程_FTP服務(wù)器
- 2022-05-17 bat批處理之字符串操作的實(shí)現(xiàn)_DOS/BAT
- 2022-05-17 MacOS下如何配置多JDK,配置Jdk 1.8 jdk 11和jdk17共同管理
- 2022-07-07 C#多線程之線程鎖_C#教程
- 2022-03-14 flutter The argument type ‘String?‘ can‘t be assig
- 2022-06-04 Kubernetes中Deployment的升級(jí)與回滾_云和虛擬化
- 2022-08-16 React?中的?setState?是同步還是異步_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支