設計模式(九)組合模式
阿新 • • 發佈:2021-07-28
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 publicabstract 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、應用場景
- 作業系統的資源管理器;
- GUI中的容器層次圖;
- XML檔案解析;
- Junit單元測試框架;
- OA系統中,組織結構的處理。
5、優缺點
優點:
- 高層模組呼叫簡單;
- 節點自由增加;
- 可以清楚地定義分層次的複雜物件,表示物件的全部或部分層次,使得增加新構件也更容易;
缺點:
- 在使用組合模式時,其葉子和樹枝的宣告都是實現類,而不是介面,違反了依賴倒置原則;
- 使設計更加抽象,物件的業務規則如果很複雜,則實現組合模式具有很大的挑戰性。
本文來自部落格園,作者:it-小林,轉載請註明原文連結:https://www.cnblogs.com/linruitao/p/15067817.html