設計模式入門:組合模式 Composite Pattern

更新於 2024/09/05閱讀時間約 1 分鐘

今天來聊聊一個有趣的組合模式 Composite Pattern。想像你正在整理電腦裡的檔案。有時候你會打開單一的檔案,有時候則是整個資料夾。不論是單一檔案還是資料夾,你都希望能用相同的方式來處理它們,比如移動或刪除它們,這就是組合模式要解決的問題!


什麼是組合模式?

組合模式是一種結構型設計模式,讓你可以用同樣的方式處理單一物件和一群物件。它把物件組織成樹狀結構,你就不用再區分是在處理單一物件還是一群物件,兩者都可以統一對待。


組合模式的例子

想像你正在使用一個圖形編輯器:

1. 你可以畫一個圓形或一個方形(單一物件)

2. 你也可以畫一個由多個形狀組成的複雜圖案(一群物件)

3. 不管是單一形狀還是複雜圖案,你都希望能用同樣的方式來移動、縮放或刪除它們

這就是組合模式的魅力所在!它讓你用統一的方式來操作不同層級的物件。


組合模式的優點

組合模式的優點是簡化程式碼,不需要寫不同的程式來處理單一物件和一群物件。想要加入新類型的物件也容易擴展!只要遵循既定的介面就可以了。


什麼時候使用組合模式?

當你希望使用者忽略單個物件和組合物件的差異,並且能統一處理所有物件,或者需要表示物件的整體層次結構,那麼組合模式會是個好選擇。比如檔案管理系統、圖形編輯器或是UI系統。


總結一下,組合模式的最大優勢在於它讓我們能夠用相同的方式來操作單一物件和多個物件,非常適合有層次結構的系統設計。下次在設計程式時,如果遇到類似需求,不妨試試看組合模式吧!


想了解設計模式的實際效果,可以參考我今年在iThome鐵人賽的文章。
https://ithelp.ithome.com.tw/articles/10348091

    avatar-img
    6會員
    83內容數
    對於經營自媒體、部落格或社群媒體感興趣?我專注於提供實用的寫作技巧、數位行銷策略,以及個人成長建議。 每週,我會分享提升寫作技巧、優化部落格經營、有效管理社群媒體、以及投資理財的寶貴知識。追蹤我,獲得實用的工具和建議,讓你的個人品牌和財務管理更上一層樓!
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    ShengYu的沙龍 的其他內容
    當你旅行到不同國家時,你可能會遇到不同的插座類型和電壓規格。如果你只帶了一台手機充電器,卻沒有合適的轉接器,無論你的手機多麼高級它都無法充電。這時候一個小小的插頭轉接器就能救你一命,讓你的裝置可以順利使用。這個插頭轉接器的角色,就像軟體設計中的轉接器模式 Adapter Pattern 一樣。
    想像你進入一家高級餐廳準備點餐。菜單上的選擇繁多,而你不只是想要某個固定套餐,而是希望有些特別的要求,比如多點一份沙拉,少放一點醬料。這樣的客製化訂單流程,其實就很像建造者模式。 建造者模式是一種專門用來建立複雜物件的設計模式。它將物件的建立過程分解成一個個小步驟,讓你可以靈活選擇每一個步驟的內容
    想像你正坐在一間高級餐廳裡。你不會直接走進廚房告訴廚師你想吃什麼,而是向服務生點餐。服務生記下你的要求,然後傳達給廚房。這個看似簡單的過程,其實蘊含了一個軟體設計概念,那就是命令模式 Command Pattern。今天就來聊聊這個能讓程式碼更具彈性的設計模式。 什麼是命令模式? 命令模式是一種行
    在生活中我們有時會遇到無法直接完成某些事情的情況,於是我們請來了一個「代理」來幫我們處理一切。比如你想買一台限量版遊戲機,但因為距離太遠或沒時間親自去購買,你就找了一個代購服務來幫你完成購買。這個代購就是你的「代理」。 在軟體設計中,代理模式 Proxy Pattern 的概念也很類似,它是一
    當你走進特斯拉的汽車工廠時,會發現這裡不僅僅是生產一款車型的工廠。無論是Model 3、Model Y、Model S還是Model X,它們都來自這個工廠,但各自有著獨特的設計和功能。這就是工廠方法模式 Factory Method Pattern 的一個生動例子。 什麼是工廠方法模式?
    在軟體開發中,有些時候我們需要確保某個類別在整個應用程式中只存在一個實例。例如當我們開發一個設定管理器時,需要保證在整個程式執行期間,所有的設定讀取和修改都要經由同一個物件。這時候單例模式就派上用場了。 什麼是單例模式? 單例模式是一種設計模式,用來確保一個類別在程式中只會有一個實例,並且提
    當你旅行到不同國家時,你可能會遇到不同的插座類型和電壓規格。如果你只帶了一台手機充電器,卻沒有合適的轉接器,無論你的手機多麼高級它都無法充電。這時候一個小小的插頭轉接器就能救你一命,讓你的裝置可以順利使用。這個插頭轉接器的角色,就像軟體設計中的轉接器模式 Adapter Pattern 一樣。
    想像你進入一家高級餐廳準備點餐。菜單上的選擇繁多,而你不只是想要某個固定套餐,而是希望有些特別的要求,比如多點一份沙拉,少放一點醬料。這樣的客製化訂單流程,其實就很像建造者模式。 建造者模式是一種專門用來建立複雜物件的設計模式。它將物件的建立過程分解成一個個小步驟,讓你可以靈活選擇每一個步驟的內容
    想像你正坐在一間高級餐廳裡。你不會直接走進廚房告訴廚師你想吃什麼,而是向服務生點餐。服務生記下你的要求,然後傳達給廚房。這個看似簡單的過程,其實蘊含了一個軟體設計概念,那就是命令模式 Command Pattern。今天就來聊聊這個能讓程式碼更具彈性的設計模式。 什麼是命令模式? 命令模式是一種行
    在生活中我們有時會遇到無法直接完成某些事情的情況,於是我們請來了一個「代理」來幫我們處理一切。比如你想買一台限量版遊戲機,但因為距離太遠或沒時間親自去購買,你就找了一個代購服務來幫你完成購買。這個代購就是你的「代理」。 在軟體設計中,代理模式 Proxy Pattern 的概念也很類似,它是一
    當你走進特斯拉的汽車工廠時,會發現這裡不僅僅是生產一款車型的工廠。無論是Model 3、Model Y、Model S還是Model X,它們都來自這個工廠,但各自有著獨特的設計和功能。這就是工廠方法模式 Factory Method Pattern 的一個生動例子。 什麼是工廠方法模式?
    在軟體開發中,有些時候我們需要確保某個類別在整個應用程式中只存在一個實例。例如當我們開發一個設定管理器時,需要保證在整個程式執行期間,所有的設定讀取和修改都要經由同一個物件。這時候單例模式就派上用場了。 什麼是單例模式? 單例模式是一種設計模式,用來確保一個類別在程式中只會有一個實例,並且提
    你可能也想看
    Google News 追蹤
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    本文介紹瞭如何使用BAT腳本和CMD指令來自動執行檔案和空目錄的刪除作業。通過設定各種參數和指令,可以快速、有效地執行定期刪除作業,節省硬體空間並提升工作效率。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
    ※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
    Thumbnail
    我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    本文介紹瞭如何使用BAT腳本和CMD指令來自動執行檔案和空目錄的刪除作業。通過設定各種參數和指令,可以快速、有效地執行定期刪除作業,節省硬體空間並提升工作效率。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
    ※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
    Thumbnail
    我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val