設計模式系列 組合模式

2022-02-27 13:42:37 字數 3418 閱讀 1135

今天下班客廳的燈確實亮堂了許多,照照鏡子感覺自己一下蒼老許多,看來還是燈光暗比較好,看不出來自己的憔悴啊,哈哈,其實還是頭髮長了,決定出去剪髮。

到家後稍微有點後悔,我竟然一時衝動花了那麼多錢辦了張剪髮的會員卡,不過辦也辦了,只好自己安慰安慰自己,心想,辦了卡可以打折上折,而且那麼多分店想去哪家去哪家,頓時心情好為能好一點了,突然間想到了乙個模式,跟現在的場景很合適,名字叫《組合模式》,為什麼說跟組合模式很相似呢?

先看看組合模式的定義吧,在《大話設計模式一書中》組合模式的定義為:「將物件組合成樹形結構以表示『部分-整體』的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

那就拿我剪髮辦卡的事情來分析一下吧。

首先,一張卡可以在總部,分店,加盟店使用,那麼總部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,這個屬性結構的店面層級關係就明確啦。

那麼,總店刷卡消費與分店刷卡消費是一樣的道理,那麼總店與分店對會員卡的使用也具有一致性。

1.組合模式的例子

組合模式結構圖:

那麼組合模式的例項如下:

//抽象的部件類描述將來所有部件共有的行為

public

abstract

class component

set}

//新增部件

public

abstract

void add(component component);

//刪除部件

public

abstract

void remove(component component);

//遍歷所有子部件

public

abstract

void eachchild();}//

組合部件類

public

class leaf : component

//葉子節點不具備新增的能力必然也不能刪除

public

override

void remove(component component)

//葉子節點沒有子節點所以顯示自己的執行結果

public

override

void eachchild()

執行了..

",name);}}

//組合類

public

class composite : component

//刪除節點 刪除部件

public

override

void remove(component component)

//遍歷子節點

public

override

void eachchild()

執行了..

", name);

foreach (component c in mylist)}}

static

void main(string args)

執行結果如下:

2.應用組合模式的會員卡消費

那麼我們就根據我們會員卡的消費,來模擬一下組合模式的實現吧!let's go!

首先:1.我們的部件有,總店,分店,加盟店!

2.我們的部件共有的行為是:刷會員卡

3.部件之間的層次關係,也就是店面的層次關係是,總店下有分店、分店下可以擁有加盟店。

有了我們這幾個必要條件後,我的要求就是目前店面搞活動當我在總店刷卡後,就可以累積相當於在所有下級店面刷卡的積分總額,設計的**如下:

//////

店面類 抽象出來的店面部件

///public

abstract

class storefront}//

新增店面

public

abstract

void add(storefront store);

//刪除店面

public

abstract

void remove(storefront store);

//定義所有部件公用的行為 刷卡行為

public

abstract

void paybycard();

}public

class storeorbranch : storefront

public storeorbranch(string storename)

listmystorelist = new list();

//刷卡消費

public

override

void paybycard()

的積分已累加進該會員卡

", storename);

foreach (storefront sf in mystorelist)}//

增加店面

public

override

void add(storefront store)

//解除店面

public

override

void remove(storefront store)

}public

class joininstore : storefront

public joininstore(string storename)

//刷卡消費

public

override

void paybycard()

的積分已累加進該會員卡

", storename);

}public

override

void add(storefront store)

public

override

void remove(storefront store)

}static

void main(string args)

執行結果如下:

這樣在累積所有子店面積分的時候,就不需要去關心子店面的個數了,也不用關係是否是葉子節點還是組合節點了,也就是說不管是總店刷卡,還是加盟店刷卡,都可以正確有效的計算出活動積分。

3.什麼情況下使用組合模式

引用大話設計模式的片段:「當發現需求中是體現部分與整體層次結構時,以及你希望使用者可以忽略組合物件與單個物件的不同,統一地使用組合結構中的所有物件時,就應該考慮組合模式了。」

組合模式 設計模式系列之組合模式解析

今天為大家帶來死磕設計模式系列的第11個模式,屬於結構型模式的 組合模式。什麼是組合模式?組合模式解決了什麼問題?適用場景是什麼?將物件組合成樹形結構以表示 部分 整體 的層次結構。composite 使得使用者對單個物件和組合物件的使用具有一致性。如果業務中需要定義複雜的資料結構,可以用樹形巢狀來...

Android設計模式系列 組合模式

2013 11 26 15 48 佚名 eoe android開發者社群 字型大小 t t android中對組合模式的應用,可謂是氾濫成粥,隨處可見,那就是view和viewgroup類的使用。在android ui設計,幾乎所有的widget和布局類都依靠這兩個類。android中對組合模式的應...

組合模式 設計模式 組合模式

1.需求分析 假設要給乙個大公司做辦公管理系統,公司有人力資源部 財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部 財務部等,要求總公司 分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式 組合模式。2.定義 將物件組合...