常用設計模式系列(十三)—組合模式

常用設計模式系列(十三)—組合模式

第一節

前言

hello大家好,今年已經過去了一半,年初立下的flag,不知道實現了沒有,你的flag改了多少次?無論自己的愿望是否完成,我們都應該懷揣著追逐夢想之心,去嘗試突破上一年的自我。我去年的flag雖然也沒有實現,但是自己努力去做了,結果其實并不重要,更不要成為自己內心阻撓自己努力的絆腳石,加油,年輕人!

今天學習對象結構型設計模式的最后一章:組合模式,組合模式可以理解為整體+部分,一個整體有多個部分組成,例如一個樹由多個主干組成,每個主干又有多個樹杈,每個樹杈又有多個樹葉。

第二節

組合模式

組合(Composite
Pattern)模式的定義:有時又叫作整體-部分(Part-Whole)模式,它是一種將對象組合成樹狀的層次結構的模式,用來表示“整體-部分”的關系,使用戶對單個對象和組合對象具有一致的訪問性,屬于結構型設計模式。組合模式一般是用來描述整體與部分的關系,我們可以把它應用到數據結構的樹形結構當中,頂層的節點就是根節點,根節點下面可以包含多個樹枝節點和多個葉子節點,樹枝節點下面又可以包含樹枝節點和葉子節點,類似于我們學習數據結構中的樹形結構。在組合模式中,整個樹形結構中的對象都屬于同一種類型,帶來的好處就是用戶不需要辨別是樹枝節點還是葉子節點,可以直接進行操作,給用戶的使用帶來極大的便利。

在這里插入圖片描述

在這里插入圖片描述

image

在這里插入圖片描述

前兩天圣誕節,小張同學為了慶祝過節,跑到了大超市買了很多的菜與肉類,從超市出來,小張同學買了許多的物品,跟超市的售貨員要了很大的帶子,這個大袋子里裝了用中型號袋子裝的各種蔬菜、塑料包裝的肉卷,小袋子裝的散裝丸子和小袋子裝的火鍋底料,中型的帶子里又裝了許多小袋子,每個小袋子都是一種蔬菜,而小袋子裝的盒子里面有三個更小的盒子,每個盒子分別是雞肉卷、羊肉卷、肥牛卷。這種大袋子套中袋子和物品,中袋子又套小袋子和物品的場景,無論是大袋子還是小袋子還是蔬菜,都屬于物品,這種嵌套組合,就是組合模式。

在這里插入圖片描述

image

第三節

代碼實現

1.編寫抽象構件

package com.yang.composite;/*** @ClassName Articles* @Description 抽象構件-物品* @Author IT小白架構師之路* @Date 2020/12/29* @Version 1.0**/
public interface Articles {//計算價格public float calculation();//展示內容方法public void show();
}

2.編寫樹枝角色

package com.yang.composite;import java.util.ArrayList;
import java.util.List;/*** @ClassName Bags* @Description 樹枝構件:袋子* @Author IT小白架構師之路* @Date 2020/12/29* @Version 1.0**/
public class Bags implements Articles {private String name;     //名字private List<Articles> bags = new ArrayList<Articles>();public Bags(String name) {this.name = name;}public void add(Articles c) {bags.add(c);}public void remove(Articles c) {bags.remove(c);}public Articles getChild(int i) {return bags.get(i);}public float calculation() {float s = 0;for (Object obj : bags) {s += ((Articles) obj).calculation();}return s;}public void show() {for (Object obj : bags) {((Articles) obj).show();}}
}

3.編寫樹葉角色

package com.yang.composite;/*** @ClassName Goods* @Description 樹葉構件:商品* @Author IT小白架構師之路* @Date 2020/12/29 16:53* @Version 1.0**/
public class Goods implements Articles {private String name;     //名字private int quantity;    //數量private float unitPrice; //單價//構造方法public Goods(String name, int quantity, float unitPrice) {this.name = name;this.quantity = quantity;this.unitPrice = unitPrice;}public float calculation() {return quantity * unitPrice;}public void show() {System.out.println(name + "(數量:" + quantity + ",單價:" + unitPrice + "元)");}
}

4.編寫測試類

package com.yang.composite;/*** @ClassName Client* @Description 客戶端測試* @Author IT小白架構師之路* @Date 2020/12/29* @Version 1.0**/
public class Client {public static void main(String[] args) {float s = 0;Bags BigBag, mediumBag, smallRedBag, smallWhiteBag;Goods sp;BigBag = new Bags("大袋子");mediumBag = new Bags("中袋子");smallRedBag = new Bags("紅色小袋子");smallWhiteBag = new Bags("白色小袋子");sp = new Goods("菠菜", 2, 7.9f);smallRedBag.add(sp);sp = new Goods("火鍋底料", 1, 9.9f);smallRedBag.add(sp);sp = new Goods("羊肉", 2, 38);smallWhiteBag.add(sp);sp = new Goods("紅酒", 3, 180);smallWhiteBag.add(sp);sp = new Goods("鴨血", 1, 10);mediumBag.add(sp);mediumBag.add(smallRedBag);sp = new Goods("土豆", 1, 3);BigBag.add(sp);BigBag.add(smallWhiteBag);BigBag.add(mediumBag);System.out.println("您選購的商品有:");BigBag.show();s = BigBag.calculation();System.out.println("要支付的總價是:" + s + "元");}
}

5.運行結果如下

您選購的商品有:土豆(數量:1,單價:3.0元)
羊肉(數量:2,單價:38.0元)
紅酒(數量:3,單價:180.0元)
鴨血(數量:1,單價:10.0元)
菠菜(數量:2,單價:7.9元)
火鍋底料(數量:1,單價:9.9元)
要支付的總價是:654.7元

第四節

優缺點分析與適用場景

優點

1.組合模式使客戶端代碼可以統一且通用的處理單個對象和組合對象,無須關心自己處理的是單個對象,還是組合對象,簡化了調用者的邏輯
2.在組合體內部增加對象變得很輕松,不需要修改源代碼來增加新的對象.

缺點:

1.設計的過程中,要考慮滿足類之前的通用抽象性,否則無法使用組合模式

2.如果限制具體構建,則很難限制.

3.不容易使用繼承的方法來擴展新功能,只能使用別的方式

適用場景

1.當系統中一些對象能夠按照一致的方式去處理,例如無限極菜單\無限極權限,需要對象與整體同時使用。

2.需要隱藏組合對象與單個對象不同時,不同的單個對象的特殊方法,也不能被訪問到的場景。

3.只需要客戶端對抽象構建編程,不需要考慮內部實現的場景。

掃描二維碼

關注我吧

IT小白架構師之路

image

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

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

相關文章

字節碼操作工具——ByteBuddy應用(3)安全檢查

一、檢測方法名是否符合規范1、代碼&#xff08;1&#xff09;MethodLoggerAgentpackage com.example.agent;import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; import net.bytebuddy.matcher.ElementMatchers;import java.lang.instrument.…

NineData 數據庫 DevOps 全面支持 GaussDB,國產化管理再升級!

NineData 數據庫 DevOps 平臺現已全面兼容 GaussDB 全線產品&#xff08;包括 GaussDB 企業級、DWS 數據倉庫、openGauss 開源版&#xff09;&#xff0c;實現一站式管理。無論 GaussDB 實例部署在哪個環境&#xff0c;企業所有開發者都可以通過 NineData 統一訪問&#xff0c;…

C++ - 模板進階

一、非類型模板參數模板參數 分為 類型形參與 非類型形參。 類型形參&#xff1a;出現在模板參數列表中&#xff0c;跟在 class 或者 typename 之類的參數類型名稱。 非類型形參&#xff0c;就是用一個常量作為類(函數)模板的一個參數&#xff0c;在類(函數)模板中可將該參數…

【質量管理】軟件缺陷管理實施方案(專業版)

引言 方案目標與范圍 本方案以CMMI量化管理要求與ISO 9000質量體系為框架,核心目標是通過標準化缺陷管理流程實現缺陷全生命周期可控。具體包括:確保軟件缺陷在全生命周期中被及時發現與修復,減少其對軟件質量、發布計劃及用戶體驗的負面影響;以“零缺陷”為首要目標,針對…

Elasticsearch 講解及 Java 應用實戰:從入門到落地

在數據量爆炸的今天&#xff0c;傳統數據庫的查詢能力越來越難以滿足復雜的檢索需求。比如電商平臺的商品搜索&#xff0c;需要支持關鍵詞模糊匹配、多條件篩選、熱門度排序等功能&#xff0c;這時候 Elasticsearch&#xff08;簡稱 ES&#xff09;就成了最佳選擇。作為一款分布…

docker pull weaviate 國內拉取失敗的問題

我是校內網&#xff0c;嘗試了 改鏡像源 (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo vim /etc/docker/daemon.json [sudo] password for ruiy: (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo service docker restart (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo docke…

Vue項目使用Univer Sheets

Univer Excel主頁鏈接&#xff1a;安裝步驟 1. 安裝 使用預設模式的包管理器安裝 - 預設模式&#xff1a;可以理解為開包即用的模式&#xff0c;省去很多配置&#xff0c;當然自由度不如插件模式 pnpm add univerjs/presets univerjs/preset-sheets-core2. 前端代碼 <te…

Python day24

浙大疏錦行 python day24 內容&#xff1a; 元組&#xff1a;類比于列表&#xff0c;不過元組的元素不能被修改&#xff0c;顯示也是從[]改為了()&#xff0c;其余操作則是和列表類似&#xff0c;且元組是有序的可迭代對象&#xff1a;即可以使用迭代器訪問的對象&#xff0c…

Three.js 動畫系統入門:Tween.js 與 AnimationMixer 的使用

引言 動畫是 Three.js 中增強 3D 場景動態效果的核心技術&#xff0c;能夠為用戶帶來沉浸式體驗。Three.js 支持通過 Tween.js 實現簡單的屬性動畫&#xff0c;以及通過 AnimationMixer 處理復雜的混合動畫和骨骼動畫。本文將深入探討如何使用 Tween.js 控制 Object3D 的屬性動…

裝修進度管理系統功能對比:主流工具9選

本文分享了9款常用的裝修進度管理軟件&#xff0c;包括&#xff1a;1.Worktile&#xff1b;2.中望軟件&#xff1b;3.三維家&#xff1b;4.Procore&#xff1b;5.易達裝修管理系統&#xff1b;6.裝修管家&#xff1b;7.Zoho Projects&#xff1b;8.中建君聯&#xff1b;9.一品裝…

深度學習篇---預訓練模型

在深度學習中&#xff0c;預訓練模型&#xff08;Pretrained Model&#xff09; 是提升開發效率和模型性能的 “利器”。無論是圖像識別、自然語言處理還是語音識別&#xff0c;預訓練模型都被廣泛使用。下面從概念、使用原因、場景、作用等方面詳細介紹&#xff0c;并結合 Pyt…

Redis ①⑦-分布式鎖

分布式鎖 分布式鎖是鎖的一種&#xff0c;都是為了解決多線程/多進程環境下&#xff0c;對共享資源的訪問沖突問題。 不過&#xff0c;像 Java 的 synchronized 或者 C 的 mutex 這種鎖&#xff0c;都是進程內的鎖&#xff0c;而分布式鎖則是跨越進程/機器的鎖。也就是可以針對…

OpenCV-圖像預處理?【圖像顏色空間轉換、灰度化實驗、二值化處理、鏡像翻轉 和 仿射變換】

文章目錄先言一、圖像顏色空間轉換1.RGB顏色空間2.顏色加法3.顏色加權加法4.HSV顏色空間5.圖像轉換&#xff08;cvtColor()&#xff09;二、灰度實驗1.灰度圖2.圖像灰度化&#xff08;最大值法&#xff09;3.圖像灰度化&#xff08;平均值法&#xff09;4.圖像灰度化&#xff0…

APP逆向 day9 安卓開發基礎

一.前言 app逆向當然要學安卓基礎啦&#xff01;今天我們來教安卓基礎當然&#xff0c;安卓基礎不會教的很多&#xff0c;比java還要少&#xff0c;還是那句話&#xff0c;了解就好。 二.安卓環境搭建 2.1 安卓介紹 如果做安卓開發 需要會java代碼安卓SDK(安卓提供的內置…

Jmeter的元件使用介紹:(三)配置元件詳解02

六、計數器 可以用來做一些變量自增操作。 1、Starting value:定義初始值 2、遞增&#xff1a;定義每次執行遞增多少 3、Maximum value:定義承受的最大值 4、數據格式&#xff1a;可以不填&#xff0c;也可以定義成000;001;002等等任意格式都行。&#xff08;1&#xff09;如…

JavaWeb學習打卡15(JSP標簽、JSTL標簽、EL表達式)

EL表達式&#xff1a;${ }獲取數據執行運算獲取web開發的常用對象在pom.xml 文件中導入JSP、JSTL相關依賴&#xff1a;<!--JSP依賴--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>java…

7.22數據結構——順序表

文章目錄一、思維導圖二、實現順序表的功能代碼head.htest.cmain.c一、思維導圖 二、實現順序表的功能代碼 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> //數組的最大長度 #define MAXSIZE …

【如何無限制免費試用 IDEA || Pycharm(JB 全家桶)】

如何無限制免費試用 IDEA || Pycharm(JB 全家桶) 一、目標:解決 JB 全家桶試用時長痛點 如果你是程序員,大概率用過 JetBrains 家的 IDE——IDEA 寫 Java、Pycharm 寫 Python、WebStorm 做前端,體驗確實頂流,但官方 30 天試用到期后,動輒幾千的年費實在讓人肉痛。 咱…

Qt(資源庫和按鈕組)

這一節是對上一節的補充&#xff0c;上一節提到QLabel類和QAabstractButton類&#xff0c;這節內容&#xff1a;1.如設置資源庫&#xff0c;使用資源設置圖片2. 使用按鈕組管理多個按鈕。一、資源庫1. 資源庫作用Qt的資源庫&#xff08;Resource System&#xff0c;.qrc文件&am…

一道檢驗編碼能力的字符串的題目

#include<iostream> #include<vector> #include<string> using namespace std; int bNum0,gNum0; int findEnd(string& s,int si){int lens.size();//當前字母在哪個字符串中,存入comp中string comp;if(s[si]b||s[si]o||s[si]y){comp"boy";bNu…