概述:
組合模式有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。
將物件組合成樹形結構以表示「部分-整體」的層次結構。composite模式使得使用者對單個物件和組合物件的使用具有一致性。[gof 《設計模式》]
結構圖:
舉例:
假設我們公司有做個打卡的程式,能滿足各種打卡的需要,比如整個公司能打卡,個人也能打卡(外包人員乙個人支起一片天)。我們看看用組合模式是怎麼實現的,這裡不就講怎麼演化的了!演化的過程比較容易誤導。12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
4344
4546
4748
4950
5152
5354
5556
5758
5960
6162
6364
6566
6768
6970
public
abstract
class
company
set
}
//新增公司
public
abstract
void
add(company name);
//移除公司
public
abstract
void
remove(company name);
//打卡
public
abstract
void
register();
}
//個人
public
class
personal : company
public
override
void
add(company name)
public
override
void
remove(company name)
//打卡
public
override
void
register()
打卡了"
,_name);
}
}
//乙個公司
public
class
wholecompany : company
public
override
void
remove(company name)
public
override
void
register()
"
, companyname);
foreach
(var item
in
mylist)
}
}
我們看看 客戶端怎麼呼叫:12
3456
78910
1112
1314
1516
1718
1920
2122
2324
25class
program
}
寫到這裡我們會發現,設計模式大多數都可以通用,同一種業務可以用很多種設計模式來做,但是只要我們弄清楚適用場景,就能選出乙個更合適我們需求的設計模式。
以下情況下適用composite模式:
1.你想表示物件的部分-整體層次結構
2.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。
設計模式系列文章入口
溫故而知新
堆排 建立堆,維護堆的屬性 一次拿掉乙個,然後維護屬性,二分的結構 使得維護屬性只要logn的時間 冒泡也是一次拿走乙個 但是線性的結構 每次沒有節省時間 快排 一次確定 乙個值的位置,然後二分,縮小問題的範圍。floyd找最短 一次更新 將狀態改為經過固定點的 最短距離 迴圈 遍歷每個點,則結果為...
溫故而知新 設計模式之Builder
builder模式主要用於以下場景 需要建立乙個較複雜的大物件例項,並且構成該物件的子物件可能經常會發生變化,但是組成大物件的演算法卻相對穩定。比如 我們做b s開發時,經常會遇到一些系統要求支援模板 切換,乙個完整的頁面由若干子模組組成,不管模板如何變換,子模組的內容 位置如何變化,但組成頁面的演...
溫故而知新之素數
明明是小學生的知識點,可是現在看來卻把我完全整懵了。o o 糾結了幾天,正好碰到老師講類似的例題。如何判斷數m為素數,素數也是質數,只能被1和m整除。即不存在m i,t 1,使得m i t,如果用數學方法的話,那麼範圍可以縮小,令k m,i的範圍可以縮小到2 k,演算法如下 依次用2 k之間的整數整...