組合模式詳解(Java)

一、組合模式基本概念
1.1 定義與類型

組合模式是一種結構型設計模式,它通過將對象組織成樹形結構,來表示“部分-整體”的層次關系。這種模式使得客戶端可以一致地對待單個對象和組合對象,從而簡化了客戶端代碼的復雜性。組合模式的核心在于定義了一個抽象組件角色,這個角色既可以代表葉子節點,也可以代表容器節點,每個節點都可以包含子節點。

在組合模式中,對象被組織成一種樹形結構,這種結構允許對象以層次化的方式組合,形成一個整體。樹形結構的頂端是根節點,根節點下面可以有多個子節點,這些子節點可以是葉子節點,也可以是其他容器節點。這種結構允許我們以一致的方式來處理單個對象和組合對象,使得客戶端代碼更加簡潔和統一。

// 抽象組件角色
public interface Component {void operation();void add(Component component);void remove(Component component);Component getChild(int index);
}// 葉子節點角色
public class Leaf implements Component {@Overridepublic void operation() {// 具體操作}@Overridepublic void add(Component component) {// 葉子節點不能添加子節點throw new UnsupportedOperationException();}@Overridepublic void remove(Component component) {// 葉子節點不能移除子節點throw new UnsupportedOperationException();}@Overridepublic Component getChild(int index) {// 葉子節點沒有子節點throw new IndexOutOfBoundsException();}
}// 容器節點角色
public class Composite implements Component {private List<Component> children = new ArrayList<>();@Overridepublic void operation() {// 具體操作for (Component component : children) {component.operation();}}@Overridepublic void add(Component component) {children.add(component);}@Overridepublic void remove(Component component) {children.remove(component);}@Overridepublic Component getChild(int index) {return children.get(index);}
}
1.2 組合模式的目的

組合模式的主要目的是使得客戶端可以一致地對待單個對象和組合對象。通過這種方式,客戶端無需關心它處理的是單個對象還是一組對象,這大大簡化了客戶端的代碼復雜性。例如,在一個文件系統中,文件和文件夾可以被視為組合模式中的對象,客戶端可以以相同的方式操作文件和文件夾,而無需知道它們的具體類型。

此外,組合模式通過提供一個統一的接口,使得新增節點類型變得非常容易,而無需修改現有的代碼。這符合設計模式中的開閉原則,即在增加新功能時,無需修改現有代碼。通過組合模式,我們可以輕松地在樹形結構中添加或刪除節點,而不會影響其他部分的代碼。這種靈活性使得組合模式在處理復雜層次結構時顯得尤為強大。

二、組合模式的結構
2.1 抽象組件角色(Component)

抽象組件角色是組合模式中的核心,它定義了樹結構中所有對象的公共接口和方法。這個角色通常是一個接口或抽象類,它聲明了所有子類都必須實現的方法,如添加子節點、刪除子節點等操作。通過抽象組件角色,客戶端可以一致地對待所有對象,無論是葉子節點還是容器節點。

抽象組件角色的主要職責是提供一個統一的操作接口,使得客戶端可以在不知道具體對象類型的情況下進行操作。例如,在一個圖形用戶界面中,抽象組件角色可以定義繪制、移動和縮放等操作,無論是按鈕、文本框還是復合面板,都必須實現這些方法。這樣,客戶端就可以以相同的方式處理所有這些組件,而無需關心它們的具體類型。

public interface Component {void operation();void add(Component component);void remove(Component component);Component getChild(int index);
}
2.2 葉子節點角色(Leaf)

葉子節點角色表示樹結構中的末端節點,它不包含

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

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

相關文章

LabVIEW危化品倉庫的安全監測系統

本案例展示了基于LabVIEW平臺設計的危化品倉庫安全監測系統&#xff0c;結合ZigBee無線通信技術、485串口通訊技術和傳感器技術&#xff0c;實現了對危化品倉庫的實時無線監測。該系統不僅能提高安全性&#xff0c;還能大幅提升工作效率&#xff0c;確保危化品倉庫的安全運營。…

【私人筆記】Web前端

Vue專題 vue3 vue3 頁面路徑前面添加目錄 - 路由base設置 - vite設置base https://mbd.baidu.com/ma/s/XdDrePju 修改vite.config.js export default defineConfig({base: /your-directory/,// 其他配置... }); vue2 uniapp 【持續更新】uni-app學習筆記_uniapp快速復制一…

數倉搭建:DWB層(基礎數據層)

維度退化: 通過減少表的數量和提高數據的冗余來優化查詢性能。 在維度退化中&#xff0c;相關的維度數據被合并到一個寬表中&#xff0c;減少了查詢時需要進行的表連接操作。例如&#xff0c;在銷售數據倉庫中&#xff0c;客戶信息、產品信息和時間信息等維度可能會被合并到一…

【Linux】進程間通信——進程池

文章目錄 進程池什么進程池進程池的作用 用代碼模擬進程池管道信息任務類InitProcesspool()DisPatchTasks()任務的執行邏輯&#xff08;Work&#xff09;CleanProcessPool() 封裝main.ccChannel.hppProcessPool.hppTask.hppMakefile 總結總結 進程池 什么進程池 進程池&#…

13-跳躍游戲 II

給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。 每個元素 nums[i] 表示從索引 i 向后跳轉的最大長度。換句話說&#xff0c;如果你在 nums[i] 處&#xff0c;你可以跳轉到任意 nums[i j] 處: 0 < j < nums[i] i j < n 返回到達 nums[n - 1] 的最…

Qt的QToolBox的使用

QToolBox 是 Qt 框架中的一個控件&#xff0c;用于創建一個可折疊的“工具箱”界面&#xff08;類似 Windows 資源管理器的側邊欄&#xff09;。每個子項可以展開或折疊&#xff0c;適合用于分組顯示多個功能模塊。以下是其基本用法和示例&#xff1a; 1. 基本用法 創建并添加…

《DeepSeek 一站式工作生活 AI 助手》

最近國產AI工具DeepSeek在全球火出圈&#xff0c;登頂多個國家應用商店&#xff0c;下載量一路飆升。這匹AI “黑馬” 到底憑什么征服全球用戶&#xff1f;讓我們全方位解鎖DeepSeek——從基礎入門到高階玩法&#xff0c;從實用技巧到隱藏功能。 DeepSeek是一款功能強大的國產A…

Java中CompletableFuture異步工具類

參考&#xff1a;CompletableFuture 詳解 | JavaGuide 實際項目中&#xff0c;一個接口可能需要同時獲取多種不同的數據&#xff0c;然后再匯總返回&#xff0c;舉個例子&#xff1a;用戶請求獲取訂單信息&#xff0c;可能需要同時獲取用戶信息、商品詳情、物流信息、等數據。…

Oracle Rac 多路徑鏈路不穩定引發IO降速-光弱

一、背景 今天突然被異地的同事拉來開遠程會議&#xff0c;會議內容是開發反饋每天9點左右有個sqlldr 命令的腳本調用突然執行很慢&#xff0c;以前幾秒的導入操作現在需要30-60s左右&#xff0c;而且數據量基本相同。 二、分析 1&#xff09;、查看ASH報告 從報告上確認是數…

哈希表-兩個數的交集

代碼隨想錄-刷題筆記 349. 兩個數組的交集 - 力扣&#xff08;LeetCode&#xff09; 內容: 集合的使用 , 重復的數剔除掉&#xff0c;剩下的即為交集&#xff0c;最后加入數組即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…

[JVM篇]分代垃圾回收

分代垃圾回收 分代收集法是目前大部分 JVM 所采用的方法&#xff0c;其核心思想是根據對象存活的不同生命周期將內存劃分為不同的域&#xff0c;一般情況下將 GC 堆劃分為老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特點是每次垃圾回收時只有少量對象…

漢諾塔問題詳解:遞歸與分治的經典案例

嘿&#xff0c;小伙伴們&#xff01;今天我可算撞見了個超有意思的東西&#xff0c;就是那大名鼎鼎的漢諾塔問題&#xff01;我這好奇心一下子就被勾起來了&#xff0c;迫不及待地想深挖一下&#xff0c;然后把那些好玩的、燒腦的、讓人拍案叫絕的解題思路和奇妙故事都分享給大…

vue中如何動態的增減組件的類名(class)

在 Vue.js 2 中&#xff0c;你可以通過計算屬性或直接在模板中使用 v-bind:class 來動態地改變組件的類名。下面是一個簡單的示例&#xff0c;說明如何在某個條件被復核后為組件添加一個 selected 類&#xff08;此處為組件添加一個默認的類&#xff08;例如 radio&#xff09;…

Vue3 基礎概念與環境搭建

一、Vue3 簡介 Vue3 是 Vue.js 的最新主要版本&#xff0c;于 2020 年 9 月正式發布。它在性能、可維護性和開發體驗方面都有了顯著的改進。相比 Vue2&#xff0c;Vue3 的主要特點包括&#xff1a; 更高效的響應式系統&#xff1a;使用 Proxy替代了 Object.defineProperty&…

華為昇騰920b服務器部署DeepSeek翻車現場

最近到禍一臺HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的訊飛大模型&#xff0c;發現資源利用率太低了。把5臺減少到3臺&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照慣例先來看看配置。一共3塊盤&#xff0c;500G的系統盤&#xff0c; 2塊3T固態…

Python的那些事第二十三篇:Express(Node.js)與 Python:一場跨語言的浪漫邂逅

摘要 在當今的編程世界里,Node.js 和 Python 像是兩個性格迥異的超級英雄,一個以速度和靈活性著稱,另一個則以強大和優雅聞名。本文將探討如何通過 Express 框架將 Node.js 和 Python 結合起來,打造出一個高效、有趣的 Web 應用。我們將通過一系列幽默風趣的實例和表格,展…

Word中接入大模型教程

前言 為什么要在word中接入大模型呢&#xff1f; 個人覺得最大的意義就是不用來回切換與復制粘貼了吧。 今天分享一下昨天實踐的在word中接入大模型的教程。 在word中接入大模型最簡單的方式就是使用vba。 vba代碼要做的事&#xff0c;拆分一下就是&#xff1a; 獲取用戶…

open3d繪制平面

在Open3D中繪制平面通常涉及到創建一個平面模型并將其可視化。Open3D是一個開源庫,主要用于3D數據的處理和可視化,但它主要用于3D數據的處理,并不直接支持繪制2D平面。如果你想在Open3D中“繪制”一個平面,你可以通過以下幾種方法來實現類似的效果: 方法1:使用o3d.geome…

DeepSeek R1 與 OpenAI O1:機器學習模型的巔峰對決

我的個人主頁 我的專欄&#xff1a;人工智能領域、java-數據結構、Javase、C語言&#xff0c;希望能幫助到大家&#xff01;&#xff01;&#xff01;點贊&#x1f44d;收藏? 一、引言 在機器學習的廣袤天地中&#xff0c;大型語言模型&#xff08;LLM&#xff09;無疑是最…

WebGPU頂點插槽進階優化指南:釋放GPU渲染性能

本文基于WebGPU官方規范與實踐經驗&#xff0c;深入探討頂點緩沖區的性能優化策略&#xff0c;涵蓋數據布局、資源管理、渲染流程等多個維度&#xff0c;并附詳細代碼注釋與性能對比分析。 一、數據布局優化&#xff1a;降低內存與帶寬壓力 1. 內存對齊策略 GPU對內存訪問有嚴…