碼迷,mamicode.com
首頁 > 其他好文 > 詳細

設計模式(九)組合模式

時間:2021-07-28 21:38:24      閱讀:0      評論:0      收藏:0      [點我收藏+]

標簽:osi   class   消費   junit單元測試   static   mamicode   rac   tde   esc   

1、簡介

  組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象。用來表示部分以及整體層次。這周類型的設計模式屬于結構型模式,創建了對象組的樹形結構。

  這種模式創建了一個包含自己對象組的類,提供了修改相同對象組的方式。

  組合模式類似樹形結構,上一層節點的包含多個下一層的節點,而下一層的節點只依附于一個上一層的節點。

 

2、類圖分析

技術圖片

 

 

 

 

  主要分為以下三個角色:

  • 抽象類部件:用于提供子類的共同方法,保證整體和部分的對象具有一致性;
  • 葉子部件:葉子就是整體部分中的部分,不同的葉子有自己的行為;
  • 整體部門:這個就是整體,擁有所有葉子的集合,對葉子資源進行管理和控制。

 

3、代碼實例

 

 1 /**
 2  * @author it-小林
 3  * @desc 店鋪抽象類
 4  * @date 2021年07月28日 18:24
 5  */
 6 public abstract class Market {
 7     String name;
 8 
 9     public abstract void add(Market market);
10 
11     public abstract void remove(Market market);
12 
13     public abstract void payByCard();
14 }
 1 /**
 2  * @author it-小林
 3  * @desc 分店 下面可以有加盟店
 4  * @date 2021年07月28日 18:27
 5  */
 6 public class MarketBranch extends Market{
 7     //加盟店列表
 8     List<Market> marketList = new ArrayList<>();
 9 
10     public MarketBranch(String name){
11         this.name = name;
12     }
13 
14     @Override
15     public void add(Market market) {
16         marketList.add(market);
17     }
18 
19     @Override
20     public void remove(Market market) {
21         market.remove(market);
22     }
23 
24     @Override
25     public void payByCard() {
26         System.out.println(name + "消費,積分已累加入該會員卡");
27         for (Market m : marketList) {
28             m.payByCard();
29         }
30 
31     }
32 }
 1 /**
 2  * @author it-小林
 3  * @desc
 4  * @date 2021年07月28日 18:30
 5  */
 6 public class MaketJoin extends Market{
 7     public MaketJoin(String name){
 8         this.name = name;
 9     }
10 
11     @Override
12     public void add(Market market) {
13 
14     }
15 
16     @Override
17     public void remove(Market market) {
18 
19     }
20 
21     @Override
22     public void payByCard() {
23         System.out.println(name + "消費,積分已累加入該會員卡");
24     }
25 }
 1 /**
 2  * @author it-小林
 3  * @desc
 4  * @date 2021年07月28日 18:34
 5  */
 6 public class TestDemo {
 7     public static void main(String[] args) {
 8         Market root = new MarketBranch("總店");
 9         Market szBranch = new MarketBranch("深圳分店");
10         Market ftJoin = new MaketJoin("福田加盟店");
11         Market nsJoin = new MaketJoin("南山加盟店");
12 
13         szBranch.add(ftJoin);
14         szBranch.add(nsJoin);
15         root.add(szBranch);
16         root.payByCard();
17     }
18 }

運行結果

技術圖片

 

 

4、應用場景

  1. 操作系統的資源管理器;
  2. GUI中的容器層次圖;
  3. XML文件解析;
  4. Junit單元測試框架;
  5. OA系統中,組織結構的處理。

 

5、優缺點

優點:

  1. 高層模塊調用簡單;
  2. 節點自由增加;
  3. 可以清楚地定義分層次的復雜對象,表示對象的全部或部分層次,使得增加新構件也更容易;

缺點:

  1. 在使用組合模式時,其葉子和樹枝的聲明都是實現類,而不是接口,違反了依賴倒置原則;
  2. 使設計更加抽象,對象的業務規則如果很復雜,則實現組合模式具有很大的挑戰性。

 

設計模式(九)組合模式

標簽:osi   class   消費   junit單元測試   static   mamicode   rac   tde   esc   

原文地址:https://www.cnblogs.com/linruitao/p/15067817.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 mamicode.com 版權所有  聯系我們:gaon5@hotmail.com
迷上了代碼!
4399在线看MV_久久99精品久久久久久久久久_成人又黄又爽又刺激视频_能收黄台的app不收费