【設計模式--結構型--組合模式】

設計模式--結構型--組合模式

    • 組合模式
      • 定義
      • 結構
      • 案例
      • 組合模式的分類
      • 優點
      • 使用場景

組合模式

定義

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

結構

  • 抽象根節點(Component):定義系統各層次對象的共有方法和屬性,可以預定義一些默認行為和屬性。
  • 樹枝節點(Composite):定義樹枝節點的行為,存儲子節點,組合樹枝節點和葉子節點形成一個樹型結構。
  • 葉子節點(Leaf):葉子節點對象,其下再無分支,是系統層次遍歷的最小單位。

案例

如下圖,我們在訪問別的一些管理系統時,經常可以看到類似的菜單。一個菜單可以包含菜單項,也可以包含帶有其他菜單項的菜單,因此使用組合模式就很恰當。
需求:針對一個菜單,打印出其包含的所有菜單以及菜單項。

  • 系統管理
    • 菜單管理
      • 編輯菜單
      • 刪除菜單
      • 新增菜單
    • 權限配置
      • 權限設置
      • 新增權限
    • 角色管理
      • 新增角色
      • 刪除角色
        類圖:
        在這里插入圖片描述
/*** 菜單組件  抽象根節點*/
public abstract class MenuComponent {// 菜單組件的名稱protected String name;// 菜單組件的層級protected int level;// 添加子菜單public void add(MenuComponent menuComponent){throw new UnsupportedOperationException();}// 移除子菜單public void remove(MenuComponent menuComponent){throw new UnsupportedOperationException();}// 獲取指定的子菜單public MenuComponent getChild(int index){throw new UnsupportedOperationException();}// 獲取菜單或者菜單項的名稱public String getName(){return name;}// 打印菜單名稱(包含子菜單和子菜單項)public abstract void print();
}
/*** 菜單類  樹枝節點*/
public class Menu extends MenuComponent {// 菜單可以有多個子菜單或者子菜單項private List<MenuComponent> menuComponentList = new ArrayList<>();// 構造方法public Menu(String name, int level) {this.name = name;this.level = level;}@Overridepublic void add(MenuComponent menuComponent) {menuComponentList.add(menuComponent);}@Overridepublic void remove(MenuComponent menuComponent) {menuComponentList.remove(menuComponent);}@Overridepublic MenuComponent getChild(int index) {return menuComponentList.get(index);}@Overridepublic void print() {// 打印菜單名稱for (int i = 0; i < level; i++) {System.out.print("—");}System.out.println(name);// 打印子菜單或子菜單項名稱for (MenuComponent menuComponent : menuComponentList) {menuComponent.print();}}
}
/*** 菜單項  葉子節點*/
public class MenuItem extends MenuComponent{public MenuItem(String name, int level){this.name = name;this.level = level;}@Overridepublic void print() {for (int i = 0; i < level; i++) {System.out.print("—");}System.out.println(name);}
}
public class Test01 {public static void main(String[] args) {// 創建菜單樹MenuComponent menu1 = new Menu("菜單管理", 2);menu1.add(new MenuItem("編輯菜單", 3));menu1.add(new MenuItem("刪除菜單", 3));menu1.add(new MenuItem("新增菜單", 3));MenuComponent menu2 = new Menu("權限管理", 2);menu2.add(new MenuItem("權限設置", 3));menu2.add(new MenuItem("新增權限", 3));MenuComponent menu3 = new Menu("角色管理", 2);menu2.add(new MenuItem("新增角色", 3));menu2.add(new MenuItem("刪除角色", 3));// 創建一級菜單MenuComponent component = new Menu("系統管理", 1);component.add(menu1);component.add(menu2);component.add(menu3);// 打印菜單名稱(如果有子菜單一起打印)component.print();}
}

在這里插入圖片描述

組合模式的分類

在使用組合模式時,根據抽象構件類的定義形式,可將組合模式分為透明組合模式和安全組合模式兩種形式。

  • 透明組合模式
    在透明組合模式中,抽象根節點角色中聲明了所有用于管理成員對象的方法,比如在實例中MenuComponent聲明了add、remove,getChild方法,這樣做的好處是確保所有的構件類都有相同的接口。透明組合模式也是組合模式的標準形式。透明組合模式的缺點是不夠安全,因為葉子節點對象和容器對象在本質上是有區別的,葉子對象不可能有下一個層次的對象,即不可能包含成員對象,因此為其提供add()remove()等方法是沒有意義的,這在編譯階段不會出錯,但是在運行階段如果調用這些方法可能會出錯(如果沒有提供相應的錯誤處理代碼)
  • 安全組合模式
    在安全組合模式中,在抽象構件角色中沒有聲明任何用于管理成員對象的方法,而是在樹枝節點Menu類中聲明并實現這些方法。安全組合模式的缺點時不夠透明,因為葉子構件和容器構件具有不同的方法,且容器構件中那些用于管理成員對象的方法沒有在抽象構件類中定義,因此客戶端不能完全針對抽象編程,必須有區別的對待葉子構件和容器構件。

優點

  • 組合模式可以清楚的定義分層次的復雜對象,表示對象的全部或部分層次,它讓客戶端忽略了層次的差異,方便對整個層次結構進行控制。
  • 客戶端可以一致的使用一個組合結構或者其中單個對象,不必關系處理的是單個對象還是整個組合結構,簡化客戶端代碼。
  • 在組合模式中增加新的樹枝節點和子節點都很方便,無需對現有類庫進行任何修改,符合開閉原則。
  • 組合模式為樹型結構的面向對象實現提供了一種靈活的解決方案,通過葉子節點和樹節點的遞歸組合,可以形成復雜的樹型結構,但對樹型結構的控制卻非常簡單。

使用場景

出現樹型結構的地方都可以使用組合模式

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214993.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新增模板中心和系統設置模塊,支持飛書平臺對接,DataEase開源數據可視化分析平臺v2.1.0發布

這一版本的功能升級包括&#xff1a;新增模板中心&#xff0c;用戶可以通過模板中心的模板快速創建儀表板和數據大屏&#xff1b;新增“系統設置”功能模塊&#xff0c;該模塊包含系統參數、認證設置、嵌入式管理、平臺對接四個子模塊。在“系統參數”子模塊中&#xff0c;用戶…

代碼上傳的gitee平臺

1.首先我們訪問工作臺 - Gitee.com進行注冊和登錄 2.我們創建一個倉庫&#xff1a; 3.在本地創建我們的項目 在這文件夾里面我們打開git bush,執行 一下操作&#xff1a; git init &#xff1a;初始化倉庫 git status&#xff1a;檢查狀態 git add . &#xff1a;將當前文件…

ubuntu 命令行安裝 conda

安裝包地址&#xff1a; Index of / 找到對應的版本&#xff0c;右鍵點復制鏈接 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.shbash Anaconda3-2023.09-0-Linux-x86_64.sh https://linzhji.blog.csdn.net/article/details/126530244

BERT大模型:英語NLP的里程碑

BERT的誕生與重要性 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;大模型標志著自然語言處理&#xff08;NLP&#xff09;領域的一個重要轉折點。作為首個利用掩蔽語言模型&#xff08;MLM&#xff09;在英語語言上進行預訓練的模型&…

Keepalived+Nginx實現高可用(上)

一、背景與簡介 為了服務的高可用性&#xff0c;避免單點故障問題&#xff0c;通常我們使用"冗余設計思想"進行架構設計。冗余設計思想&#xff0c;本質就是將同一個應用或者服務放置在多臺不同的服務器上[雞蛋不放在同一個籃子里]&#xff0c;這樣減少整體服務宕機的…

ACWing week 3(C語言) 725.完全數

一個整數&#xff0c;除了本身以外的其他所有約數的和如果等于該數&#xff0c;那么我們就稱這個整數為完全數。 例如&#xff0c;66 就是一個完全數&#xff0c;因為它的除了本身以外的其他約數的和為 1236 現在&#xff0c;給定你 N 個整數&#xff0c;請你依次判斷這些數是…

ESP32網絡開發實例-搭建ESP32固件遠程升級服務器

搭建ESP32固件遠程升級服務器 文章目錄 搭建ESP32固件遠程升級服務器1、ESP32設備自動升級流程2、軟件準備3、硬件準備4、代碼實現4.1 固件升級服務器代碼實現4.2 基礎固件代碼4.3 新固件代碼實現我們在前面的文章中,已經實現了OTA方式升級固件的兩種方式:在Arduino IDE 中升…

數據結構與算法-動態規劃-機器人達到指定位置方法數

機器人達到指定位置方法數 來自左程云老師書中的一道題 【題目】 假設有排成一行的 N 個位置&#xff0c;記為 1~N&#xff0c;N 一定大于或等于 2。開始時機器人在其中的 M 位置上&#xff08;M 一定是 1&#xff5e;N 中的一個&#xff09;&#xff0c;機器人可以往左走或…

基于大語言模型的復雜任務認知推理算法CogTree

近日&#xff0c;阿里云人工智能平臺PAI與華東師范大學張偉教授團隊合作在自然語言處理頂級會議EMNLP2023上發表了基于認知理論所衍生的CogTree認知樹生成式語言模型。通過兩個系統&#xff1a;直覺系統和反思系統來模仿人類產生認知的過程。直覺系統負責產生原始問題的多個分解…

10 # 類:繼承和成員修飾符

類的基本實現 類的成員屬性都是實例屬性&#xff0c;而不是原型屬性&#xff0c;類的成員方法都是原型方法。 class Dog {constructor(name: string) {this.name name;}name: string;run() {} }console.log(Dog.prototype); let dog new Dog("wangwang"); consol…

知識筆記(五十四)———mysql比較varchar值大小_Mysql varchar大小長度問題

1、限制規則 字段的限制在字段定義的時候有以下規則&#xff1a; a) 存儲限制 varchar 字段是將實際內容單獨存儲在聚簇索引之外&#xff0c;內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節)&#xff0c;因此最大長度不能超過65535。 b) 編碼長度限制 字符類…

低功耗模式的通用 MCU ACM32F0X0 系列,具有高整合度、高抗干擾、 高可靠性的特點

ACM32F0X0 系列是一款支持多種低功耗模式的通用 MCU。集成 12 位 1.6 Msps 高精度 ADC 以及比 較器、運放、觸控按鍵控制器、段式 LCD 控制器&#xff0c;內置高性能定時器、多路 UART、LPUART、SPI、I2C 等豐富的通訊外設&#xff0c;內建 AES、TRNG 等信息安全模塊&#xff0…

kubeadm搭建單master多node的k8s集群--小白文,圖文教程

參考文獻 K8S基礎知識與集群搭建 kubeadm搭建單master多node的k8s集群—主要參考這個博客&#xff0c;但是有坑&#xff0c;故貼出我自己的過程&#xff0c;坑會少很多 注意&#xff1a; 集群配置是&#xff1a;一臺master&#xff1a;zabbixagent-k8smaster&#xff0c;兩臺…

C++類和對象——(10)綜合示例

一、示例對象數組&#xff1a; #include<iostream> using namespace std;class Point{private:int x,y;public:Point(int px0,int py0){xpx;ypy;}void init(int px0,int py0){xpx;ypy;}void print(){cout<<"("<<x<<","<<y…

FFmpeg的AVInputFormat

文章目錄 結構體定義操作函數支持的AVOutputFormat 通過上面的分析&#xff0c;基本可以看到ffmpeg的套路了&#xff0c;首先一個context上下文&#xff0c;上下文里面一個priv_data 指針&#xff0c;然后再插件結構體中有一個priv_data_size&#xff0c;然后回調函數。 結構體…

JVM-GC調優-字節碼篇-01

筆記來源&#xff1a;JVM 注意&#xff1a;實在想學習可以看一下&#xff0c;讓自己更加了解JVM&#xff0c;看起來可能會枯燥。 JVM-概述 1、你的問題 1.1你被JVM傷害過嗎&#xff1f; 你是否也遇到過這些問題&#xff1f; 運行著的線上系統突然卡死&#xff0c;系統無法訪…

Flink SQL: 高效解析 Kafka 數據并存儲為 Parquet 至 HDFS

目錄 總體流程介紹 1. 從 Kafka 讀取數據 2. 使用 UDF 進行數據解析 3. 將

HTML中如何設置音頻和視頻?

文章目錄 &#x1f50a;嵌入音頻&#x1f39e;?嵌入視頻 &#x1f50a;嵌入音頻 HTML 元素用于在文檔中嵌入音頻內容。 元素可以包含一個或多個音頻資源&#xff0c; 這些音頻資源可以使用 src 屬性或者 元素來進行描述&#xff1a;瀏覽器將會選擇最合適的一個來使用。也可以使…

Centos7云服務器上安裝cobalt_strike_4.7。附cobalt_strike_4.7安裝包

環境這里是阿里的一臺Centos7系統。 開始安裝之前首先要確保自己安裝了java11及以上環境。 安裝java11步驟&#xff1a; sudo yum update sudo yum install java-11-openjdk-devel把服務器端&#xff08;CS工具分服務器端和客戶端&#xff09;的CS安裝到服務器上后給目錄下的…

Mongoose 對象文檔模型庫

一、介紹 Mongoose是一個對象文檔模型庫&#xff0c;官網&#xff1a;http://www.mongoosejs.net/ 二、作用 方便使用代碼操作Mongodb數據庫 三、使用流程 //1. 安裝 mongoose //2. 導入 mongoose const mongoose require(mongoose); //3. 連接數據庫 mongoose.connect(m…