先看看組合模式的定義吧:“將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。”
就拿剪髮辦卡的事情來分析一下吧。
首先,一張卡可以在總部,分店,加盟店使用,那麼總部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,這個屬性結構的店面層級關係就明確啦。
那麼,總店刷卡消費與分店刷卡消費是一樣的道理,那麼總店與分店對會員卡的使用也具有一致性。
1.組合模式的例子
那麼組合模式的實例如下:
- import java.util.ArrayList;
- import java.util.List;
- public class ComponentDemo {
- public abstract class Component {
- String name;
- public abstract void add(Component c);
- public abstract void remove(Component c);
- public abstract void eachChild();
- }
- // 組合部件類
- public class Leaf extends Component {
- // 葉子節點不具備添加的能力,所以不實現
- @Override
- public void add(Component c) {
- // TODO Auto-generated method stub
- System.out.println("");
- }
- // 葉子節點不具備添加的能力必然也不能刪除
- @Override
- public void remove(Component c) {
- // TODO Auto-generated method stub
- System.out.println("");
- }
- // 葉子節點沒有子節點所以顯示自己的執行結果
- @Override
- public void eachChild() {
- // TODO Auto-generated method stub
- System.out.println(name + "執行了");
- }
- }
- // 組合類
- public class Composite extends Component {
- // 用來保存節點的子節點
- List<Component> list = new ArrayList<Component>();
- // 添加節點 添加部件
- @Override
- public void add(Component c) {
- // TODO Auto-generated method stub
- list.add(c);
- }
- // 刪除節點 刪除部件
- @Override
- public void remove(Component c) {
- // TODO Auto-generated method stub
- list.remove(c);
- }
- // 遍歷子節點
- @Override
- public void eachChild() {
- // TODO Auto-generated method stub
- System.out.println(name + "執行了");
- for (Component c : list) {
- c.eachChild();
- }
- }
- }
- public static void main(String[] args) {
- ComponentDemo demo = new ComponentDemo();
- // 構造根節點
- Composite rootComposite = demo.new Composite();
- rootComposite.name = "根節點";
- // 左節點
- Composite compositeLeft = demo.new Composite();
- compositeLeft.name = "左節點";
- // 構建右節點,添加兩個葉子幾點,也就是子部件
- Composite compositeRight = demo.new Composite();
- compositeRight.name = "右節點";
- Leaf leaf1 = demo.new Leaf();
- leaf1.name = "右-子節點1";
- Leaf leaf2 = demo.new Leaf();
- leaf2.name = "右-子節點2";
- compositeRight.add(leaf1);
- compositeRight.add(leaf2);
- // 左右節點加入 根節點
- rootComposite.add(compositeRight);
- rootComposite.add(compositeLeft);
- // 遍歷組合部件
- rootComposite.eachChild();
- }
- }
執行結果如下:
2.應用組合模式的會員卡消費
那麼我們就根據我們會員卡的消費,來模擬一下組合模式的實現吧!let's go!
首先:
1.我們的部件有,總店,分店,加盟店!
2.我們的部件共有的行爲是:刷會員卡
3.部件之間的層次關係,也就是店面的層次關係是,總店下有分店、分店下可以擁有加盟店。
有了我們這幾個必要條件後,我的要求就是目前店面搞活動當我在總店刷卡後,就可以累積相當於在所有下級店面刷卡的積分總額,設計的代碼如下:
- import java.util.ArrayList;
- import java.util.List;
- public class PayDemo {
- public abstract class Market {
- String name;
- public abstract void add(Market m);
- public abstract void remove(Market m);
- public abstract void PayByCard();
- }
- // 分店 下面可以有加盟店
- public class MarketBranch extends Market {
- // 加盟店列表
- List<Market> list = new ArrayList<PayDemo.Market>();
- public MarketBranch(String s) {
- this.name = s;
- }
- @Override
- public void add(Market m) {
- // TODO Auto-generated method stub
- list.add(m);
- }
- @Override
- public void remove(Market m) {
- // TODO Auto-generated method stub
- list.remove(m);
- }
- // 消費之後,該分店下的加盟店自動累加積分
- @Override
- public void PayByCard() {
- // TODO Auto-generated method stub
- System.out.println(name + "消費,積分已累加入該會員卡");
- for (Market m : list) {
- m.PayByCard();
- }
- }
- }
- // 加盟店 下面不在有分店和加盟店,最底層
- public class MarketJoin extends Market {
- public MarketJoin(String s) {
- this.name = s;
- }
- @Override
- public void add(Market m) {
- // TODO Auto-generated method stub
- }
- @Override
- public void remove(Market m) {
- // TODO Auto-generated method stub
- }
- @Override
- public void PayByCard() {
- // TODO Auto-generated method stub
- System.out.println(name + "消費,積分已累加入該會員卡");
- }
- }
- public static void main(String[] args) {
- PayDemo demo = new PayDemo();
- MarketBranch rootBranch = demo.new MarketBranch("總店");
- MarketBranch qhdBranch = demo.new MarketBranch("秦皇島分店");
- MarketJoin hgqJoin = demo.new MarketJoin("秦皇島分店一海港區加盟店");
- MarketJoin btlJoin = demo.new MarketJoin("秦皇島分店二白塔嶺加盟店");
- qhdBranch.add(hgqJoin);
- qhdBranch.add(btlJoin);
- rootBranch.add(qhdBranch);
- rootBranch.PayByCard();
- }
- }
運行結果如下:
這樣在累積所有子店面積分的時候,就不需要去關心子店面的個數了,也不用關係是否是葉子節點還是組合節點了,也就是說不管是總店刷卡,還是加盟店刷卡,都可以正確有效的計算出活動積分。
3.什麼情況下使用組合模式
引用大話設計模式的片段:“當發現需求中是體現部分與整體層次結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮組合模式了。”
轉載自 http://blog.csdn.net/jason0539/article/details/22642281