1. 程式人生 > 其它 >設計模式(九)組合模式

設計模式(九)組合模式

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. 使設計更加抽象,物件的業務規則如果很複雜,則實現組合模式具有很大的挑戰性。
如本文有侵權行為,請及時與本人聯絡,多多包涵! 小生初出茅廬,多多指教!

本文來自部落格園,作者:it-小林,轉載請註明原文連結:https://www.cnblogs.com/linruitao/p/15067817.html