秒懂設計模式--學習筆記(8)【結構型-組合模式】

目錄

      • 7、組合模式
          • 7.1 組合模式(Composite)
          • 7.2 叉樹結構
          • 7.3 文件系統
          • 7.4 目錄樹展示
          • 7.5 自相似性的涌現
          • 7.6 組合模式的各角色定義
          • 7.7 組合

7、組合模式

7.1 組合模式(Composite)
  • 是針對由多個節點對象(部分)組成的樹形結構的對象(整體)而發展出的一種結構型設計模式
  • 它能夠使客戶端在操作整體對象或者其下的每個節點對象時做出統一的響應,保證樹形結構對象使用方法的一致性
  • 整體和部分,有類似結構
  • 測試類結構
    組合模式測試類
7.2 叉樹結構
  • 某些具有從屬關系的事物之間存在著一定的相似性
  • 不管從哪個層級,我們都會得到一個固定的結構
  • 這種結構類似于經典的“叉樹”結構:無論數據元素是“根”“枝”,還是“葉”,甚至是整體的樹,都具有類似的結構
  • 我們可以用組合模式來表達“部分/整體”的層次結構提取并抽象其相同的部分特殊化其不同的部分,以提高系統的可復用性與可擴展性
7.3 文件系統
  • 以類似于樹結構的文件系統的目錄結構為例
  • 抽象節點類Node
    • 定義一個抽象的“節點”類來模糊“文件夾”與“文件”
    • 構造方法中接收并初始化已定義的節點名,否則不允許節點被創建,這也是可以固化下來的邏輯
    • 聲明抽象方法,模糊行為并留給子類去實現
package composite;/*** 抽象節點類**/
public abstract class Node {// 節點命名protected  String name;/*** 構造方法,需傳入節點名*  構造方法中接收并初始化已定義的節點名,否則不允許節點被創建,這也是可以【固化下來的邏輯】*/public Node(String name) {this.name = name;}/*** 添加下級節點方法: 聲明其為抽象方法,模糊此行為并留給子類去實現* @param child*/protected abstract void add(Node child) throws Exception;
}
  • 節點實現類1:文件夾類Folder
    • 文件夾類繼承了抽象節點類Node
    • 文件夾下級可以包含任意多個文件夾或者文件:次級節點列表List
package composite;import java.util.ArrayList;
import java.util.List;/*** 文件夾類:繼承了抽象節點類Node**/
public class Folder extends Node {/*** 文件夾可以包含子節點(子文件夾或文件)*  此處的泛型Node既可以是文件夾又可以是文件*/List<Node> children = new ArrayList<>();/*** 調用父類構造方法:初始化其文件夾名* @param name*/public Folder(String name) {super(name);}/*** 重寫添加方法:可以添加子節點* @param child*/@Overrideprotected void add(Node child) {children.add(child);}
}
  • 節點實現類2:文件類File
    • 其作為末端節點,不應該具備添加子節點的功能
package composite;/*** 文件類:繼承了抽象節點類Node**/
public class File extends Node {/*** 調用父類構造方法:初始化其文件夾名* @param name*/public File(String name) {super(name);}/*** 文件不包含子節點: 告知用戶“不能添加子節點”* 其實更好的方式是以拋出異常的形式來確保此處邏輯的正確性,外部如果捕獲到該異常則可以做出相應的處理* @param child*/@Overrideprotected void add(Node child) {System.out.println("文件類型不能添加子節點");}
}
  • 客戶端測試類:創建文件夾及文件
package composite;/*** 客戶端測試類**/
public class Client {public static void main(String[] args) throws Exception {// 為根節點構建了目錄樹Node driveD = new Folder("測試盤");// “文檔”和“音樂”兩個文件夾Node doc = new Folder("文檔");doc.add(new File("簡歷.doc"));doc.add(new File("項目介紹.ppt"));driveD.add(doc);// “文檔”和“音樂”兩個文件夾Node music = new Folder("音樂");// 一級文件夾來區分歌手Node jay = new Folder("周杰倫");jay.add(new File("雙截棍.mp3"));jay.add(new File("告白氣球.mp3"));jay.add(new File("聽媽媽的話.mp3"));// 一級文件夾來區分歌手Node jack = new Folder("張學友");jack.add(new File("吻別.mp3"));jack.add(new File("一千個傷心的理由.mp3"));music.add(jay);music.add(jack);driveD.add(music);}
}
7.4 目錄樹展示
  • 要體現出組合模式的優勢還在于如何運用這個樹結構
  • 分級展示整棵目錄樹
    • 輸出節點名稱(文件夾名/文件名)之前加上數個空格以表示不同層級
    • 修改抽象節點類Node并加入展示方法tree()
        /*** 此處是抽象節點類的實體方法,所以要保持其通用性。*      我們抽離出所有節點“相同”的部分作為“公有”的代碼塊,*      而“不同”的行為部分則留給子類去實現* @param space 空格數(層級縮進展示)*/protected void  tree(int space) {//先循環輸出space個空格for (int i = 0; i < space; i++) {System.out.print("    ");}//接著再輸出自己的名字System.out.println(name);}/*** 無參重載方法,默認從第0列開始展示(無層級縮進)*/protected void tree() {this.tree(0);}
    
    • 節點實現類File和Folder重寫展示方法,Folder還要展示其子級
        /*** Folder* 文件夾類就比較特殊了,它不僅要先輸出自己的名字,還要換行再逐個輸出子節點的名字,并且要保證空格逐級遞增*/@Overridepublic void tree(int space) {// 調用父類通用的tree方法列出自己的名字super.tree(space);// 在循環的子節點前,空格數要加1space++;// 下一級的子節點我們需要依次輸出for (Node child : children) {// 調用子節點的tree方法child.tree(space);}}
    
    /*** File* 文件類可以不做任何修改,而是直接繼承父類的展示方法,* 此處是為了更清晰直觀地看到這種繼承關系,同時方便后續做出其他修改* @param space*/
    @Override
    public void tree(int space){super.tree(space);
    }
    
    • 客戶端在任何一級節點上只要調用其展示方法并傳入當前目錄所需的空格偏移量,就可出現樹形列表了
    	// Client類的main方法最后添加調用目錄樹展示方法driveD.tree();
    
    • 空格偏移量這個必傳參數,可以為抽象節點類添加一個無參的展示方法,默認為0
7.5 自相似性的涌現
  • 組合模式將樹形結構的特點發揮得淋漓盡致
    • 作為最高層級抽象的抽象節點類(接口)泛化了所有節點類使任何“整體”或“部分”達成統一
    • 枝(根)節點與葉節點的多態化實現以及組合關系進一步勾勒出的樹形結構
7.6 組合模式的各角色定義
  • Component(組件接口):
    • 所有復合節點與葉節點的高層抽象,定義出需要對組件操作的接口標準
    • 如抽象節點類Node,具體使用接口還是抽象類需根據具體場景而定。
  • Composite(復合組件):
    • 包含多個子組件對象(可以是復合組件或葉端組件)的復合型組件,并實現組件接口中定義的操作方法。
    • 如:“根節點/枝節點”的文件夾類Folder
  • Leaf(葉端組件):
    • 不包含子組件的終端組件,同樣實現組件接口中定義的操作方法。
    • 如: “葉節點”的文件類File
  • Client(客戶端):
    • 按所需的層級關系部署相關對象并操作組件接口所定義的接口,即可遍歷樹結構上的所有組件
7.7 組合
  • 類似的結構總是在重復、迭代地顯現出某種自似性
  • 其部分與整體一致的呈現與“組合模式”如出一轍

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

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

相關文章

關于string的‘\0‘與string,vector構造特點,反迭代器與迭代器類等的討論

目錄 問題一&#xff1a;關于string的\0問題討論 問題二&#xff1a;C標準庫中的string內存是分配在堆上面嗎&#xff1f; 問題三&#xff1a;string與vector的capacity大小設計的特點 問題四&#xff1a;string的流提取問題 問題五&#xff1a;迭代器失效 問題六&#xf…

個人開發實現AI套殼網站快速搭建(Vue+elementUI+SpringBoot)

目錄 一、效果展示 二、項目概述 三、手把手快速搭建實現本項目 3.1 前端實現 3.2 后端方向 五、后續開發計劃 一、效果展示 默認展示 一般對話展示&#xff1a; 代碼對話展示&#xff1a; 二、項目概述 本項目是一個基于Web的智能對話服務平臺&#xff0c;通過后端與第…

【C語言】指針(4):深入理解指針

目錄 ?編輯 一、回調函數 二、qsort使用舉例 2.1 使用qsort排序整型數據 2.2 使用qsort排序結構體數據 三、qsort的模擬實現 四、NULL、\0、0、0、null、NUL的區別 五、C99中的變長數組 一、回調函數 函數指針是將函數的地址取出來&#xff0c;再通過函數地址去調用&a…

untiy 在菜單欄添加自定義按鈕 點擊按鈕彈出一個Unity窗口,并在窗口里添加屬性

using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering.PostProcessing;public class AutoGenerateWindow : EditorWindow //這是定義一個窗口 {public string subjecttName "科目名字";//科目的名字public GameOb…

springboot 與 ipv6

ipv6 是個必然趨勢&#xff0c;尤其最近國家在這方面有新的推動。 運營商的項目逐漸有這方面的要求了。 所以&#xff0c;在ipv6環境&#xff0c;http或者https接口&#xff0c;還有數據庫地址&#xff0c;ipv4下是ip:port&#xff0c; 但到了ipv6&#xff0c;ipv6 的 ip就包含…

PIOMAS二進制文件轉nc文件

文章目錄 1. 按年輸出數據2. 按月輸出數據將PIOMAS標量的二進制數據格式轉化成nc格式。 1. 按年輸出數據 # 按年輸出數據 import numpy as np import pandas as pd import struct import xarray as xr import matplotlib.pyplot as plt # from cartoplot import cartoplotgri…

另一種加快大表查詢的方法:將表分區

在 MySQL 中&#xff0c;對表進行分區是一種將大表分成更小、更易于管理和查詢片段的方式。分區能夠顯著提升查詢和維護的性能&#xff0c;特別是對大數據量的表。以下是 MySQL 表分區的基礎知識和具體操作步驟。 分區類型 MySQL 支持如下主要分區類型&#xff1a; RANGE 分…

url鏈接地址,#前的參數 和 #后的參數有什么區別

例如 http://localhost:8080/?beforeParams1#/workSchemelist/index?afterParams1 beforeParams 和 afterParams 區別 打印出來可以發現&#xff1a; beforeParams 是 url 的search參數&#xff0c;通過window.location.search獲取 afterParams 是 route 的query參數&#…

行列視(RCV)是否支持自定義字段、計算公式和數據分析功能,以滿足用戶的不同需求?

行列視&#xff08;RCV&#xff09;確實支持自定義字段、計算公式和數據分析功能&#xff0c;以滿足用戶的不同需求。具體表現如下&#xff1a; 1. 自定義字段&#xff1a;RCV提供自助式數據應用&#xff0c;允許用戶根據自己的需求&#xff0c;選擇所需的字段來構建符合自己業…

外貿網站設計的要點

外貿網站設計是一種專門針對國際貿易領域的網站設計&#xff0c;需要考慮到不同國家和文化背景的用戶&#xff0c;因此設計過程要更加細致和精準。以下是外貿網站設計的關鍵要點&#xff1a; 首先&#xff0c;多語言支持是不可或缺的&#xff0c;因為外貿網站的用戶可能來自不同…

[Python自動化辦公]--從網頁登錄網易郵箱進行郵件搜索并下載郵件附件

[Python自動化辦公]–從網頁登錄網易郵箱進行郵件搜索并下載郵件附件 使用說明 ? 本文使用Python的selenium庫進行操作郵箱登錄、固定名稱搜索郵件并下載附件&#xff0c;Python版本&#xff1a;3.9.16, selenium版本&#xff1a;4.19.0&#xff0c;EdgeBrowser版本:126.0.2…

LVS集群及其它的NAT模式

1.lvs集群作用&#xff1a;是linux的內核層面實現負載均衡的軟件&#xff1b;將多個后端服務器組成一個高可用、高性能的服務器的集群&#xff0c;通過負載均衡的算法將客戶端的請求分發到后端的服務器上&#xff0c;通過這種方式實現高可用和負載均衡。 2.集群和分布式&#…

用戶增長 - 私域 - 社群運營自檢清單SOP(社群運營30問)

Check List: 1.你的目標用戶是誰&#xff1f; 2.你的目標用戶有哪些需要立馬解決的需求&#xff1f;有哪些長期需求&#xff1f;這些需求的優先級是什么&#xff1f; 3.做社群的目的是什么&#xff1f; 4.你的用戶和業務是否適合做社群&#xff1f; 5.你做哪類社群才能更好的幫…

確定適合您需求的負載組

大多數關鍵任務行業都使用 UPS 和發電機等備用電源在停電期間為其設施提供持續電力。負載組允許您在需要時測試電源&#xff0c;以確保在您最需要的時候提供可靠的電力。 選擇正確的負載組對于準確的電源測試至關重要。為了幫助您找到最適合您設施需求的負載組&#xff0c;EAK…

Hudi 索引總結 - Parquet布隆過濾器寫入過程

前言 上篇文章 提到 :索引的邏輯主要是根據 parquet 文件中保存的索引信息,判斷記錄是否存在,如果不存在,代表是新增數據,如果記錄存在則代表是更新數據,需要找到并設置 currentLocation。對于布隆索引來說,這里的索引信息其實是布隆過濾器,本篇文章主要是先總結布隆過…

【機器學習】主成分分析(PCA):數據降維的藝術

&#x1f308;個人主頁: 鑫寶Code &#x1f525;熱門專欄: 閑話雜談&#xff5c; 炫酷HTML | JavaScript基礎 ?&#x1f4ab;個人格言: "如無必要&#xff0c;勿增實體" 文章目錄 主成分分析&#xff08;PCA&#xff09;&#xff1a;數據降維的藝術引言PCA的基…

技術成神之路:設計模式(四)工廠方法模式

1.定義 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;它提供了一種創建對象的接口&#xff0c;而不是通過具體類來實例化對象。工廠方法模式的主要作用是讓子類決定實例化哪一個類&#xff0c;從而實現對象創建的延遲到具體子類…

2024年6月國產數據庫大事記-墨天輪

本文為墨天輪社區整理的2024年6月國產數據庫大事件和重要產品發布消息。 目錄 2024年6月國產數據庫大事記 TOP102024年6月國產數據庫大事記&#xff08;時間線&#xff09;產品/版本發布兼容認證代表廠商大事記廠商活動相關資料 2024年6月國產數據庫大事記 TOP10 2024年6月國…

最優雅的PHP框架 Laravel

Laravel 之所以被稱為最優雅的 PHP 框架,是因為它在設計和功能上做了很多獨特的創新,極大地提高了開發效率和代碼的可維護性。以下是 Laravel 受歡迎的主要原因: 良好的文檔和社區支持 Laravel 有詳盡的官方文檔,涵蓋了框架的所有功能和用法。此外,Laravel 社區非常活躍…

【Python】已解決:SyntaxError invalid syntax

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決&#xff1a;SyntaxError invalid syntax 一、分析問題背景 在Python編程中&#xff0c;SyntaxError: invalid syntax是一個常見的錯誤&#xff0c;它通常表示代碼中存在語法…