結構型模式3.組合模式

結構型模式

  1. 適配器模式(Adapter Pattern)
  2. 橋接模式(Bridge Pattern)
  3. 組合模式(Composite Pattern)
  4. 裝飾器模式(Decorator Pattern)
  5. 外觀模式(Facade Pattern)
  6. 享元模式(Flyweight Pattern)
  7. 代理模式(Proxy Pattern)

組合模式(Composite Pattern) 是一種結構型設計模式,旨在將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得客戶端可以統一對待單個對象和對象集合,即把對象當作單一對象來處理,從而簡化了操作和使用的復雜性。

核心思想:

組合模式將對象組合成樹形結構,并允許客戶端通過統一的接口對待單一對象和對象組合。其本質是樹形結構中的每個節點可能是單個對象,也可能是對象的組合(集合)。客戶端通過同一接口處理這些對象,從而達到簡化代碼和增強靈活性的目的。

主要角色:

  1. Component(組件):定義了一個接口,聲明了基本的操作(如?add()remove()getChild()?等),這使得單個對象和組合對象(即樹枝)都能使用相同的操作。
  2. Leaf(葉子節點):表示樹的葉子節點(即最基本的對象),沒有子節點,實現了組件接口。
  3. Composite(組合節點):表示樹的枝節點(即含有子節點的對象),實現了組件接口,并且能管理子組件。組合節點可以添加、刪除和獲取子組件。

示例:公司組織結構

假設我們有一個公司組織結構,其中有員工(葉子節點)和經理(組合節點),經理可以有下屬員工或者其他經理。這種組織結構非常適合使用組合模式來實現。

// 組件接口
public interface Employee {void showDetails(); // 顯示員工信息
}// 葉子節點,代表普通員工
public class RegularEmployee implements Employee {private String name;private String position;public RegularEmployee(String name, String position) {this.name = name;this.position = position;}@Overridepublic void showDetails() {System.out.println("姓名: " + name + ", 職位: " + position);}
}import java.util.ArrayList;
import java.util.List;// 組合節點,代表經理(可以包含員工或其他經理)
public class Manager implements Employee {private String name;private String position;private List<Employee> subordinates; // 下屬public Manager(String name, String position) {this.name = name;this.position = position;subordinates = new ArrayList<>();}public void addSubordinate(Employee employee) {subordinates.add(employee);}public void removeSubordinate(Employee employee) {subordinates.remove(employee);}@Overridepublic void showDetails() {System.out.println("姓名: " + name + ", 職位: " + position);System.out.println("下屬: ");for (Employee e : subordinates) {e.showDetails(); // 遞歸調用}}
}public class Client {public static void main(String[] args) {// 創建葉子節點(普通員工)Employee employee1 = new RegularEmployee("張三", "開發工程師");Employee employee2 = new RegularEmployee("李四", "設計師");// 創建組合節點(經理)Manager manager1 = new Manager("王五", "經理");Manager manager2 = new Manager("趙六", "高級經理");// 經理1有下屬員工manager1.addSubordinate(employee1);manager1.addSubordinate(employee2);// 經理2有經理1作為下屬manager2.addSubordinate(manager1);// 展示組織結構System.out.println("經理2的詳細信息:");manager2.showDetails();}
}

解釋:

  • Employee(組件):定義了一個接口,所有的員工都實現了這個接口,不管是普通員工還是經理。
  • RegularEmployee(葉子節點):普通員工,不能有下屬,實現了?Employee?接口。
  • Manager(組合節點):經理有下屬員工或者其他經理。它也實現了?Employee?接口,并且能夠管理其他員工(包括普通員工和經理)。

在客戶端代碼中,ManagerRegularEmployee 都通過 Employee 接口處理,使用 showDetails() 方法遞歸地展示組織結構。無論是單一的普通員工,還是一個包含多個員工和經理的復雜結構,客戶端都可以使用相同的接口來處理它們。

裝飾器模式 vs 組合模式:

  • 裝飾器模式:用來動態地向一個對象添加額外的功能,通常涉及一個對象及其裝飾器對象的組合。
  • 組合模式:用來將對象組織成樹形結構,表示“部分-整體”的關系,使得客戶端可以統一對待單個對象和對象組合。

優缺點:

優點:
  1. 透明性:客戶端不需要關心對象的組成細節,所有對象(包括單一對象和組合對象)都通過相同的接口進行操作。
  2. 靈活性:通過遞歸組合,可以構建出復雜的樹形結構,同時提供統一的操作方法。
  3. 簡化代碼:對于復雜的層級結構,客戶端不需要針對每一層次編寫單獨的處理代碼,減少了重復代碼。
缺點:
  1. 過度設計:如果對象本身沒有復雜的層次結構,使用組合模式可能會顯得過于復雜。
  2. 維護困難:在某些場景下,組合模式可能導致代碼結構變得非常復雜,特別是當組合對象的層次較深時。

總結:

組合模式通過遞歸組合的方式,將對象和對象組合統一處理,使得在處理“部分-整體”結構時,客戶端代碼更加簡潔。它適用于具有樹形結構的場景,如文件系統、組織結構、菜單結構等。

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

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

相關文章

服務器攻擊方式有哪幾種?

隨著互聯網的快速發展&#xff0c;網絡攻擊事件頻發&#xff0c;已泛濫成互聯網行業的重病&#xff0c;受到了各個行業的關注與重視&#xff0c;因為它對網絡安全乃至國家安全都形成了嚴重的威脅。面對復雜多樣的網絡攻擊&#xff0c;想要有效防御就必須了解網絡攻擊的相關內容…

Transformer 中縮放點積注意力機制探討:除以根號 dk 理由及其影響

Transformer 中縮放點積注意力機制的探討 1. 引言 自2017年Transformer模型被提出以來&#xff0c;它迅速成為自然語言處理&#xff08;NLP&#xff09;領域的主流架構&#xff0c;并在各種任務中取得了卓越的表現。其核心組件之一是注意力機制&#xff0c;尤其是縮放點積注意…

[python3]Excel解析庫-XlsxWriter

XlsxWriter 是一個用于創建 Excel .xlsx 文件的 Python 庫&#xff0c;它允許你編寫程序來生成 Excel 文件&#xff0c;而無需實際運行 Microsoft Excel 應用程序。XlsxWriter 支持寫入數據、應用格式化、插入圖表和圖形等多種功能&#xff0c;并且可以處理較大的數據集。它是一…

Linux下部署SSM項目

作者主頁&#xff1a;舒克日記 簡介&#xff1a;Java領域優質創作者、Java項目、學習資料、技術互助 文中獲取源碼 Linux部署SSM項目 打包項目 1、修改pom.xml文件&#xff0c;打包方式改為war <packaging>war</packaging>2、idea 通過maven的clean&#xff0c;…

Bytebase 3.0.1 - 可配置在 SQL 編輯器執行 DDL/DML

&#x1f680; 新功能 新增環境策略&#xff0c;允許在 SQL 編輯器內直接執行 DDL/DML 語句。 支持為 BigQuery 數據脫敏。 在項目下新增數據訪問控制及脫敏管理頁面。 在數據庫頁面&#xff0c;支持回滾到變更歷史的某個版本。 &#x1f514; 兼容性變更 禁止工單創建…

ansible 知識點【回顧梳理】

ansible 知識點 1. 劇本2. facts變量3. register變量4. include功能5. handlers6. when 條件7. with_items 循環8. Jinja2模板9. group_vars10. roles :star::star::star: 看起來字數很多&#xff0c;實際有很多是腳本執行結果&#xff0c;內容不多哦 1. 劇本 劇本很重要的就是…

LLM之RAG實戰(五十一)| 使用python和Cypher解析PDF數據,并加載到Neo4j數據庫

一、必備條件&#xff1a; python語言Neo4j數據庫python庫&#xff1a;neo4j、llmsherpa、glob、dotenv 二、代碼&#xff1a; from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …

MLU上使用MagicMind GFPGANv1.4 onnx加速!

文章目錄 前言一、平臺環境準備二、環境準備1.GFPGAN代碼處理2.MagicMind轉換修改env.sh修改run.sh參數解析運行 3.修改后模型運行 前言 MagicMind是面向寒武紀MLU的推理加速引擎。MagicMind能將人工智能框架&#xff08;TensorFlow、PyTorch、Caffe與ONNX等&#xff09;訓練好…

關于大數據的基礎知識(一)——定義特征結構要素

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于大數據的基礎知識&#xff08;一&a…

H5通過URL Scheme喚醒手機地圖APP

1.高德地圖 安卓URL Scheme&#xff1a;baidumap:// 官方文檔&#xff1a;https://lbs.amap.com/api/amap-mobile/guide/android/navigation IOS URL Scheme&#xff1a;iosamap:// 官方文檔&#xff1a;https://lbs.amap.com/api/amap-mobile/guide/ios/navi HarmonyOS NEXT U…

音視頻入門基礎:MPEG2-PS專題(5)——FFmpeg源碼中,解析PS流中的PES流的實現

音視頻入門基礎&#xff1a;MPEG2-PS專題系列文章&#xff1a; 音視頻入門基礎&#xff1a;MPEG2-PS專題&#xff08;1&#xff09;——MPEG2-PS官方文檔下載 音視頻入門基礎&#xff1a;MPEG2-PS專題&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音視頻入門基礎…

國標GB28181-2022視頻平臺EasyGBS小知識:局域網ip地址不夠用怎么解決?

在局域網中&#xff0c;IP地址不足的問題通常不會在小型網絡中出現&#xff0c;但在擁有超過255臺設備的大型局域網中&#xff0c;就需要考慮如何解決IP地址不夠用的問題了。 在企業局域網中&#xff0c;經常會出現私有IP地址如192.168.1.x到192.168.1.255不夠用的情況。由于0…

spring boot啟動源碼分析(三)之Environment準備

上一篇《spring-boot啟動源碼分析&#xff08;二&#xff09;之SpringApplicationRunListener》 環境介紹&#xff1a; spring boot版本&#xff1a;2.7.18 主要starter:spring-boot-starter-web 本篇開始講啟動過程中Environment環境準備&#xff0c;Environment是管理所有…

springmvc前端傳參,后端接收

RequestMapping注解 Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Mapping public interface RequestMapping {String name() default "";AliasFor("path")String[] value() default {};AliasFor(&quo…

分布式鎖 Redis vs etcd

為什么要實現分布式鎖?為什么需要分布式鎖,分布式鎖的作用是什么,哪些場景會使用到分布式鎖?分布式鎖的實現方式有哪些分布式鎖的核心原理是什么 如何實現分布式鎖redis(自旋鎖版本)etcd 的分布式鎖(互斥鎖(信號控制)版本) 分布式鎖對比redis vs etcd 總結 為什么要實現分布式…

【Excel/WPS】根據平均值,生成兩列/多列指定范圍的隨機數/隨機湊出兩列數據

原理就是通過隨機生成函數和平均值函數。 適用場景&#xff1a;在總體打分后&#xff0c;需要在小項中隨機生成小分數 第一列&#xff1a;固定的平均值A2第二列&#xff1a; RANDBETWEEN(A2-10,A210)第三列&#xff1a;根據第二列用平均值函數算除 A2*2-B2這是隨機值1的公式&am…

芯片詳細講解,從而區分CPU、MPU、DSP、GPU、FPGA、MCU、SOC、ECU

目錄 芯片的概念結構 芯片的派系劃分 通用芯片&#xff08;CPU&#xff0c;MPU&#xff0c;GPU&#xff0c;DSP&#xff09; 定制芯片&#xff08;FPGA&#xff0c;ASIC&#xff09; 芯片之上的集成&#xff08;MCU&#xff0c;SOC&#xff0c;ECU&#xff09; 軟硬件的匹…

運動相機拍攝的視頻打不開怎么辦

3-10 GoPro和大疆DJI運動相機的特點&#xff0c;小巧、高清、續航長、拍攝穩定&#xff0c;很多人會在一些重要場合用來拍攝視頻&#xff0c;比如可以用來拿在手里拍攝快速運動中的人等等。 但是畢竟是電子產品&#xff0c;有時候是會出點問題的&#xff0c;比如意外斷電、摔重…

智能化文檔開發(DI)

這個文檔涉及到多模態&#xff08;文本、發票、訂單、語音&#xff09; 對于普通的文本&#xff0c;我們希望對某些實體的某些屬性挖空生成文檔模版&#xff0c;并根據預設字段填空最后生成正式文件對于發票、訂單&#xff0c;我們想提取它的字段信息&#xff0c;寫入DB對于一些…

CSS語言的編程范式

CSS語言的編程范式 引言 在現代網頁開發中&#xff0c;CSS&#xff08;層疊樣式表&#xff09;作為一種樣式語言&#xff0c;承擔著網站前端呈現的重要角色。無論是簡單的靜態網頁還是復雜的單頁應用&#xff0c;CSS都在人機交互中發揮著至關重要的作用。掩蓋在美觀背后的&am…