今天下班客廳的燈確實亮堂了許多,照照鏡子感覺自己一下蒼老許多,看來還是燈光暗比較好,看不出來自己的憔悴啊,哈哈,其實還是頭髮長了,決定出去剪髮。
到家後稍微有點後悔,我竟然一時衝動花了那麼多錢辦了張剪髮的會員卡,不過辦也辦了,只好自己安慰安慰自己,心想,辦了卡可以打折上折,而且那麼多分店想去哪家去哪家,頓時心情好為能好一點了,突然間想到了乙個模式,跟現在的場景很合適,名字叫《組合模式》,為什麼說跟組合模式很相似呢?
先看看組合模式的定義吧,在《大話設計模式一書中》組合模式的定義為:「將物件組合成樹形結構以表示『部分-整體』的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。」
那就拿我剪髮辦卡的事情來分析一下吧。
首先,一張卡可以在總部,分店,加盟店使用,那麼總部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,這個屬性結構的店面層級關係就明確啦。
那麼,總店刷卡消費與分店刷卡消費是一樣的道理,那麼總店與分店對會員卡的使用也具有一致性。
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.定義 將物件組合...