1. 程式人生 > >設計模式--組合(Composite)模式

設計模式--組合(Composite)模式

 先看看組合模式的定義吧:“將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。

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

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

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

 1.組合模式的例子

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

[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. publicclass ComponentDemo {  
  4.     publicabstractclass Component {  
  5.         String name;  
  6.         publicabstractvoid add(Component c);  
  7.         publicabstractvoid remove(Component c);  
  8.         publicabstractvoid eachChild();  
  9.     }  
  10.     // 組合部件類
  11.     publicclass Leaf extends
     Component {  
  12.         // 葉子節點不具備新增的能力,所以不實現
  13.         @Override
  14.         publicvoid add(Component c) {  
  15.             // TODO Auto-generated method stub
  16.             System.out.println("");  
  17.         }  
  18.         // 葉子節點不具備新增的能力必然也不能刪除
  19.         @Override
  20.         publicvoid remove(Component c) {  
  21.             // TODO Auto-generated method stub
  22.             System.out.println("");  
  23.         }  
  24.         // 葉子節點沒有子節點所以顯示自己的執行結果
  25.         @Override
  26.         publicvoid eachChild() {  
  27.             // TODO Auto-generated method stub
  28.             System.out.println(name + "執行了");  
  29.         }  
  30.     }  
  31.     // 組合類
  32.     publicclass Composite extends Component {  
  33.         // 用來儲存節點的子節點
  34.         List<Component> list = new ArrayList<Component>();  
  35.         // 新增節點 新增部件
  36.         @Override
  37.         publicvoid add(Component c) {  
  38.             // TODO Auto-generated method stub
  39.             list.add(c);  
  40.         }  
  41.         // 刪除節點 刪除部件
  42.         @Override
  43.         publicvoid remove(Component c) {  
  44.             // TODO Auto-generated method stub
  45.             list.remove(c);  
  46.         }  
  47.         // 遍歷子節點
  48.         @Override
  49.         publicvoid eachChild() {  
  50.             // TODO Auto-generated method stub
  51.             System.out.println(name + "執行了");  
  52.             for (Component c : list) {  
  53.                 c.eachChild();  
  54.             }  
  55.         }  
  56.     }  
  57.     publicstaticvoid main(String[] args) {  
  58.         ComponentDemo demo = new ComponentDemo();  
  59.         // 構造根節點
  60.         Composite rootComposite = demo.new Composite();  
  61.         rootComposite.name = "根節點";  
  62.         // 左節點
  63.         Composite compositeLeft = demo.new Composite();  
  64.         compositeLeft.name = "左節點";  
  65.         // 構建右節點,新增兩個葉子幾點,也就是子部件
  66.         Composite compositeRight = demo.new Composite();  
  67.         compositeRight.name = "右節點";  
  68.         Leaf leaf1 = demo.new Leaf();  
  69.         leaf1.name = "右-子節點1";  
  70.         Leaf leaf2 = demo.new Leaf();  
  71.         leaf2.name = "右-子節點2";  
  72.         compositeRight.add(leaf1);  
  73.         compositeRight.add(leaf2);  
  74.         // 左右節點加入 根節點
  75.         rootComposite.add(compositeRight);  
  76.         rootComposite.add(compositeLeft);  
  77.         // 遍歷組合部件
  78.         rootComposite.eachChild();  
  79.     }  
  80. }  


執行結果如下:

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

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

        首先:

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

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

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

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

[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. publicclass PayDemo {  
  4.     publicabstractclass Market {  
  5.         String name;  
  6.         publicabstractvoid add(Market m);  
  7.         publicabstractvoid remove(Market m);  
  8.         publicabstractvoid PayByCard();  
  9.     }  
  10.     // 分店 下面可以有加盟店
  11.     publicclass MarketBranch extends Market {  
  12.         // 加盟店列表
  13.         List<Market> list = new ArrayList<PayDemo.Market>();  
  14.         public MarketBranch(String s) {  
  15.             this.name = s;  
  16.         }  
  17.         @Override
  18.         publicvoid add(Market m) {  
  19.             // TODO Auto-generated method stub
  20.             list.add(m);  
  21.         }  
  22.         @Override
  23.         publicvoid remove(Market m) {  
  24.             // TODO Auto-generated method stub
  25.             list.remove(m);  
  26.         }  
  27.         // 消費之後,該分店下的加盟店自動累加積分
  28.         @Override
  29.         publicvoid PayByCard() {  
  30.             // TODO Auto-generated method stub
  31.             System.out.println(name + "消費,積分已累加入該會員卡");  
  32.             for (Market m : list) {  
  33.                 m.PayByCard();  
  34.             }  
  35.         }  
  36.     }  
  37.     // 加盟店 下面不在有分店和加盟店,最底層
  38.     publicclass MarketJoin extends Market {  
  39.         public MarketJoin(String s) {  
  40.             this.name = s;  
  41.         }  
  42.         

    相關推薦

    設計模式--組合Composite模式

     先看看組合模式的定義吧:“將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。”    就拿剪髮辦卡的事情來分析一下吧。    首先,一張卡可以在總部,分店,加盟店使用,那麼總部可以刷卡,分店也可以刷卡,加盟店

    面向物件:組合Composite模式

     以下內容來自http://www.lifevv.com 本文介紹設計模式中的組合(Composite)模式的概念,用法,以及實際應用中怎麼樣使用組合模式進行開發。 Composite模式的概念 Composite模式是構造型的設計模式之一,通過遞迴手

    設計模式10—— 結構型 ——組合Composite

    簡介 定義:將物件組合成樹形結構以表示“部分——整體”的層次結構。 說明:組合模式使客戶端對單個物件和組合物件保持一致的處理方式 型別:結構型 適用場景 希望客戶端可以忽略組合物件與單個物件的差異時 處理一

    設計模式8—— 組合Composite

    簡介 定義:將物件組合成樹形結構以表示“部分——整體”的層次結構。 說明:組合模式使客戶端對單個物件和組合物件保持一致的處理方式 型別:結構型 適用場景 希望客戶端可以忽略組合物件與單個物件的差異時 處理一個樹形結構時 優點: 清楚地定義分層次的複雜

    設計模式-外觀門面模式

    文章目錄 外觀模式介紹 使用場景 程式碼例項 總結 外觀模式介紹 外觀模式,也成為門面模式,它隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。 適用方要完成一個功能,需要呼叫提供方的多個介面、方法,呼叫過程複雜時,

    java23種設計模式-門面外觀模式

    定義 外觀模式為子系統的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 UML 角色 子系統(SubSystem): 表示一個系統的子系統或者模組 門面(Facade): 客戶端通過門面間接控制子系統。門面遮蔽

    設計模式——介面卡Adapter模式

    概述   什麼是介面卡?在我們生活中的介面卡比如插頭轉換器(中標轉美標)、USB介面轉換器(type-c轉蘋果),電腦電源介面卡(交流電轉低電壓直流)等。像這種將兩者有差異的東西通過介面卡使他們成為相互適合的東西。在程式世界中,經常存在現有的程式無法直接使用,需要做適當的變換後才能使用的情況,這種

    組合模式整合到遊戲伺服器引擎中去!

    什麼是組合模式? 組合模式是一種設計模式,和物件組合的概念是不同的。物件組合是相對於物件派生而言的一種物件間協作的關係。而組合模式是將物件組合成樹形結構以表示整體-部分的層次結構,使得使用者對單個物件和組合物件的使用更加一致的一種設計模式。( compose objects

    “戲”說設計模式——外觀門面模式

    首先請出今天的主人公——“黑旋風”李逵 李逵:“我是不是萌萌噠?”  一部《水滸傳》說盡了一群英雄好漢的悲歡離合!經典著作的水滸,含蓄地概括了中國各個朝代的變遷和演變,客觀地揭露了頑固的中國倫理道德,以及那些倫理道德對國人的愚弄和危害。 故事劇情 宋江酒後在潯陽樓

    講故事學設計模式-策略Strategy模式

    策略模式(Strategy Pattern)又稱政策模式(Policy Pattern)。 這是一個關於策略模式的小故事:想象Mike開車時偶爾會超速,但他並不經常這樣。他有時會被警察逮住。假如這個警察非常好(nice),不開罰單或者只進行口頭警告就放他走。(我們稱這類警察

    GOF23設計模式組合模式composite

    ret blog 構建 樹狀結構 遍歷 合成 str 管理 rri 一、組合模式概述   將對象組合成樹狀結構以表示“部分和整體”層次結構,使得客戶可以統一的調用葉子對象和容器對象。   (1)組合模式的使用場景      把部分和整體的關系用樹形結構來表示,從而使客戶端

    設計模式-組合模式Composite

        組合模式是構造型模式的一種。通過遞迴手段來構造樹形的物件結構,並可以通過一個物件來訪問整個物件樹   角色和職責: 就是資料夾那種形式,樹形   UML圖:   具體程式碼: import java.util.List

    Java設計模式8:組合模式Composite

    組合模式(Composite) 意圖 將物件組合成樹形結構已表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性 適用性 1、你想表示物件的部分-整體層次i結構 2、你希望使用者忽略組合物件與單個休想的

    淺談JAVA設計模式之——組合模式Composite

    一、概述 將物件組合成樹形結構以表示"部分-整體"的層次結構。"Composite使得使用者對單個物件和組合物件的使用具有一致性。 二、適用性 1.你想表示物件的部分-整體層次結構。 2.你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構

    組合模式Composite

    rem for remove 安全 tco fin trac roo 問題 組合模式:將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。 public abstract class Company {

    Java 設計模式系列組合模式

    ima 技術分享 client 索引 有變 int spa 初始 類型 Java 設計模式系列(九)組合模式 將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象的使用具有一致性。 一、組合模式結構 Component: 抽象的組件對象,為

    組合模式Composite—分公司與總部

    組合模式(Composite)          將物件組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。 好處:組合模式讓客戶可以一致地使用組合結

    設計模式的征途—5.原型Prototype模式

    pla width 共享 太多的 isp text 一模一樣 軟件 集合 相信大多數的人都看過《西遊記》,對孫悟空拔毛變出小猴子的故事情節應該都很熟悉。孫悟空可以用猴毛根據自己的形象復制出很多跟自己一模一樣的小猴兵出來,其實在設計模式中也有一個類似的模式,我們可以通過一個原

    設計模式

    pan har cnblogs 變量 ring 區別 ack iostream 模式 本篇是接著設計模一:觀察者模式的續寫。 為什麽要寫這一篇呢: java在main函數裏new出的對象都是局部變量,而用C++ 在main函數裏new出來的都是 動態分配到堆區的。 那麽可不

    設計模式總結

    靈活性 mil 一個 blog 以及 對象模式 結構型設計模式 con 建模 設計模式可分為三種:創建型設計模式。結構型設計模式和行為型設計模式。 一、創建型設計模式 在設計模式中,創建型設計模式處理對象創建過程的設計模式。它依據實際情況來決定詳細如何創建對象。創建型模