您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Composite組合模式怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Composite組合模式怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Composite(組合模式)
Composite(組合模式)屬于結構型模式,是一種統一管理樹形結構的抽象方式。
意圖:將對象組合成樹形結構以表示 “部分 - 整體” 的層次結構。Composite 使得用戶對單個對象和組合對象的使用具有一致性。
舉例子
如果看不懂上面的意圖介紹,沒有關系,設計模式需要在日常工作里用起來,結合例子可以加深你的理解,下面我準備了三個例子,讓你體會什么場景下會用到這種設計模式。
公司組織關系樹
公司組織關系可能分為部門與人,其中人屬于部門,有的人有下屬,有的人沒有下屬。如果我們統一將部門、人抽象為組織節點,就可以方便的統計某個部門下有多少人、財務數據等等,而不用關心當前節點是部門還是人。
操作系統的文件夾與文件
操作系統的文件夾與文件也是典型的樹狀結構,為了方便遞歸出文件夾內文件數量或者文件總大小,我們最好設計的時候就將文件夾與文件抽象為文件,這樣每個節點都擁有相同的方法添加、刪除、查找子元素,而不需要關心當前節點是文件夾或是文件。
搭建平臺的組件與容器
容器與組件的關系很小,用戶常常認為容器也是一種組件,但搭建平臺實現時,容器與組件稍有不同,不同之處在于容器可以嵌套子元素,而組件不可以。如果因此搭建平臺就將組件分為容器與組件,會導致 API 割裂為兩套,不利于組件開發者維護與用戶理解,比較好的設計思路是將組件與容器統一看成組件,組件只是一種沒有子元素的特殊容器,這樣組件與容器就可以擁有相同的 API,統一理解與操作了。
意圖解釋
意圖:將對象組合成樹形結構以表示 “部分 - 整體” 的層次結構。Composite 使得用戶對單個對象和組合對象的使用具有一致性。
比較好理解,組合是指多個對象雖然有一定差異,但共同組合成了一個樹形結構,那么對象之間就一定存在 “部分 - 整體” 的關系,組合模式要求我們抽象一個對象 Component 作為統一操作模型,葉子結點與非葉子結點都實現了所有功能,即便是沒有子元素的葉子結點,為了強調透明性,還是具備比如 getChildren 方法,只不過永遠都返回 null。
結構圖
其中 Component 是組合中對象聲明接口,一般會實現所有公共類的所有接口,還要提供一個接口管理其子組件。
Leaf 表示葉子結點,沒有子結點,相應的 Composite 就是有子結點的節點。
可以看到,組合模式就是將樹狀結構中所有節點統一抽象了,我們不需要關心葉子結點與非葉子結點的差異,而可以通過組合模式的抽象屏蔽掉這些差異,統一處理。
代碼例子
下面例子使用 typescript 編寫。
// 統一的抽象
class Component {
// 添加子元素
public add() {}
// 獲取名稱
public getName() {}
// 獲取子元素
public getChildren() {}
}
// 非葉子結點
class Composite extends Component {
public add(component: Component) {
this.children.push(component)
}
public getName() {
return this.name
}
public getChildren() {
return this.children
}
}
// 葉子結點
class Leaf extends Component {
public add(component: Component) {
throw Error('葉子結點無法添加元素')
}
public getName() {
return this.name
}
public getChildren() {
return null
}
}
最后我們把對所有節點的操作都轉為 Component 對象,而不用關心這個對象具體是 Composite 或 Leaf。
弊端
組合模式進行了一層抽象,其實增加了復雜系統中業務復雜度。如果 Composite 與 Leaf 差異過大,那么統一抽象帶來的理解成本是很高的。
同時,Leaf 不得不實現一些僅 Composite 存在的空函數,比如 add delete,即便這些方法對他們是無意義的,此時可能要進行統一的無效或錯誤處理,才能使業務層真正不用感知他們的區別,否則 add 可能會失敗,其本質上還是將節點的區別暴露給了業務層。
讀到這里,這篇“Composite組合模式怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。