組合模式:將物件組合成樹形結構以表示「部分-整體」的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。
簡單的理解就是一顆樹中有根節點也有葉子節點,對於它們的增刪改查,我們都使用名字同樣的函式,但是具體的行為卻因為註冊時不一樣而不一樣。
看下**:
package composite
import "fmt"
type component inte***ce
const (
leafnode = iota
compositenode
)//組合模式的簡單工廠,可以看成根據引數決定建立目錄,或者檔案
//返回即可以描述目錄又可以描述檔案的inte***ce
func newcomponent(kind int, name string) component
c.setname(name)
return c
}//這個是共有部分,葉子和根節點都有這個,細節的不同可以重寫相關方法函式
type component struct
func (c *component) parent() component
func (c *component) setparent(parent component)
func (c *component) name() string
func (c *component) setname(name string)
func (c *component) addchild(component component)
func (c *component) print(string)
type leaf struct
func newleaf() *leaf
}//檔案,重寫一下print函式,因為它與目錄不一樣
func (c *leaf)print(pre string)
type composite struct
func newcomposite() *composite
}//目錄才會執行addchild
func (c *composite)addchild(child component)
//目錄的print除了列印目錄名字,還要遍歷它下面所有的檔案。
func (c *composite)print(pre string)
}
客戶端
package composite
import "testing"
func testcompsite(t *testing.t)
結果:
=== run testcompsite
-root
-c1-c3
#l1-c2
#l2#l3
--- pass: testcompsite (0.00s)
pass
優點:
缺點:使得設計更加複雜。客戶端需要花更多時間理清類之間的層次關係。(這個是幾乎所有設計模式所面臨的問題)。
注意的問題:
在以下情況下應該考慮使用組合模式:
當想表達物件的部分-整體的層次結構時。
希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件時。
.net 中winform 中的空間型別大多用到了該種設計模式。另, 《設計模式》一書中提倡:相對於安全性,我們比較強調透明性。對於第一種方式中葉子節點內不需要的方法可以使用空處理或者異常報告的方式來解決
組合模式 設計模式 組合模式
1.需求分析 假設要給乙個大公司做辦公管理系統,公司有人力資源部 財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部 財務部等,要求總公司 分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式 組合模式。2.定義 將物件組合...
設計模式 組合模式 組合模式使用
目錄 組合模式概括 組合模式使用場景 定義 將物件組合成樹形結構以表示 部分 整體 的層次結構 作用 使客戶端對單個物件和組合物件保持一致的處理方式 使用場景 1.希望客戶端可以忽略組合物件與單個物件的差異時 2.處理乙個樹形結構時 優點 清楚的定義分層次的複雜物件,表示物件的全部或部分層次 讓客戶...
組合模式 設計模式系列之組合模式解析
今天為大家帶來死磕設計模式系列的第11個模式,屬於結構型模式的 組合模式。什麼是組合模式?組合模式解決了什麼問題?適用場景是什麼?將物件組合成樹形結構以表示 部分 整體 的層次結構。composite 使得使用者對單個物件和組合物件的使用具有一致性。如果業務中需要定義複雜的資料結構,可以用樹形巢狀來...