1. 程式人生 > >結構型模式:組合模式(Composite Pattern)

結構型模式:組合模式(Composite Pattern)

一、設計模式的分類

(如果以前看過關於設計模式的分類的話,這部分可以忽略!)

經過很多大神的總結,目前Java中一共23種經典的設計模式

按照目的,設計模式可以分為以下三種用途:

1.建立型模式:用來處理物件的建立過程

2.結構型模式:用來處理類或者物件的組合

3.行為型模式:用來對類或物件怎樣互動和怎樣分配職責進行描述

建立型模式用來處理物件的建立過程,主要包含以下5種設計模式:

 工廠方法模式(Factory Method Pattern)

 抽象工廠模式(Abstract Factory Pattern)

 建造者模式(Builder Pattern)

 原型模式(Prototype Pattern)

 單例模式(Singleton Pattern)

結構型模式用來處理類或者物件的組合,主要包含以下7種設計模式:

 介面卡模式(Adapter Pattern)

 橋接模式(Bridge Pattern)

 組合模式(Composite Pattern)

 裝飾者模式(Decorator Pattern)

 外觀模式(Facade Pattern)

 享元模式(Flyweight Pattern)

 代理模式(Proxy Pattern)

行為型模式用來對類或物件怎樣互動和怎樣分配職責進行描述,主要包含以下11種設計模式:

 責任鏈模式(Chain of Responsibility Pattern)

 命令模式(Command Pattern

 直譯器模式(Interpreter Pattern)

 迭代器模式(Iterator Pattern)

 中介者模式(Mediator Pattern)

 備忘錄模式(Memento Pattern)

 觀察者模式(Observer Pattern)

 狀態模式(State Pattern)

 策略模式(Strategy Pattern)

 模板方法模式(Template Method Pattern)

 訪問者模式(Visitor Pattern) 

本篇文章主要為講解一下組合模式(Composite Pattern)

注:概念性的東西可以忽略不看,可以在看完例子以後再看概念,這樣更有利於理解!

二、組合模式概述

(注:建議沒有看過組合模式的朋友們,先看例項,然後再看枯燥的概念)

看到Composite組合模式的時候你就應該往樹形結構圖上去想,這樣更有利於你去理解組合模式!
組合模式定義:將物件以樹形結構組織起來,以達成"部分--整體"的層次結構,使得客戶端對單個物件和組合物件的使用具有一致性,方便客戶端的使用。
組合體內所有的物件都有共同的介面,當組合體中某一個物件的方法被呼叫執行時,組合模式Composite將遍歷整個樹形結構,尋找同樣包含這個方法的物件並實現呼叫執行(可以在例項中感受一下,只看概念你會感覺知識點很空洞)。

合模式讓你可以優化處理遞歸或分級資料結構。有許多關於分級資料結構的例子,使得組合模式非常有用武之地。關於分級資料結構的一個普遍性的例子是你每次使用電腦時所遇到的:檔案系統。檔案系統由目錄和檔案組成,每個目錄都可以裝內容。目錄的內容可以是檔案,也可以是目錄。按照這種方式,計算機的檔案系統就是以遞迴結構來組織的。如果你想要描述這樣的資料結構,那麼你可以使用組合模式Composite。

組合模式涉及角色:

1、Component是組合模式中的物件宣告介面,在適當的情況下,它實現所有類共有介面的預設行為。宣告一個介面用於訪問和管理Component子部件。
  2、Leaf 在組合模式中表示葉子結點物件(沒有子節點)。

  3、Composite用來定義有枝節點行為,儲存子部件,在Component介面中實現與子部件有關操作,如增加(add)和刪除(remove)等。

三、類圖


四、例項說明

如果你想要建立層次結構,並可以在其中以相同的方式對待所有元素,那麼組合模式就是最理想的選擇。

下面使用一個檔案系統的例子來舉例說明組合模式的用途。在例子中,檔案和目錄都繼承相同的介面,這是組合模式的關鍵。通過繼承相同的介面,你就可以用相同的方式對待檔案和目錄,從而實現將檔案或者目錄儲存為目錄的子級元素

舉例如下:

注:雖然下面的例子並沒有真正的生成檔案目錄結構,我們就假設生成的是目錄結構,而下面的name屬性就當做是檔案或者目錄的名字!

  1. publicabstractclass Company {  
  2.     private String name;  
  3.     public Company(String name) {  
  4.         this.name = name;  
  5.     }  
  6.     public Company() {  
  7.     }  
  8.     public String getName() {  
  9.         return name;  
  10.     }  
  11.     publicvoid setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.     protectedabstractvoid add(Company company);   //新增
  15.     protectedabstractvoid romove(Company company);//刪除  
  16.     protectedabstractvoid display(int depth);     //顯示
  17. }  
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. publicclass ConcreteCompany extends Company {  
  4.     private List<Company> cList;  
  5.     public ConcreteCompany() {  
  6.         cList = new ArrayList<Company>();  
  7.     }  
  8.     public ConcreteCompany(String name) {  
  9.         super(name);   
  10.         cList = new ArrayList<Company>() ;   
  11.     }  
  12.     @Override
  13.     protectedvoid add(Company company) {  
  14.         cList.add(company);  
  15.     }  
  16.     @Override
  17. protectedvoid display(int depth) {//深度
  18.         StringBuilder sb = new StringBuilder("");  
  19.         for (int i = 0; i < depth; i++) {  
  20.             sb.append("-");   
  21.         }
  22.         System.out.println(new String(sb) + this.getName());  
  23.         for (Company c : cList) {  
  24.             c.display(depth + 2);  
  25.         }  
  26.     }  
  27.     @Override
  28.     protectedvoid romove(Company company) {  
  29.         cList.remove(company);  
  30.     }  
  31. }  
  1. publicclass FinanceDepartment extends Company {//葉子節點
  2.     public FinanceDepartment(){  
  3.     }  
  4.     public FinanceDepartment(String name){  
  5.         super(name);  
  6.     }  
  7.     @Override
  8.     protectedvoid add(Company company) {  
  9.     }  
  10.     @Override
  11.     protectedvoid display(int depth) {  
  12.         StringBuilder sb = new StringBuilder("");  
  13.         for (int i = 0; i < depth; i++) {  
  14.             sb.append("-");  
  15.         }  
  16.         System.out.println(new String(sb) + this.getName() ) ;   
  17.     }  
  18.     @Override
  19.     protectedvoid romove(Company company) {
  20.     }  
  21. }  
  1. publicclass HRDepartment extends Company {  
  2.     public HRDepartment(){  
  3.     }  
  4.     public HRDepartment(String name){  
  5.         super(name);  
  6.     }  
  7.     @Override
  8.     protectedvoid add(Company company) {  
  9.     }  
  10.     @Override
  11.     protectedvoid display(int depth) {  
  12.         StringBuilder sb = new StringBuilder("");  
  13.         for (int i = 0; i < depth; i++) {  
  14.             sb.append("-");   
  15.         }  
  16.         System.out.println(new String(sb) + this.getName() ) ;   
  17.     }  
  18.     @Override
  19.     protectedvoid romove(Company company) {  
  20.     }  
  21. }  
  1. publicclass Client {  
  2.     publicstaticvoid main(String[] args) {  
  3.         Company root = new ConcreteCompany();  
  4.         root.setName("北京總公司");  
  5.         root.add(new HRDepartment("總公司人力資源部"));  
  6.         root.add(new FinanceDepartment("總公司財務部"));  
  7.         Company shandongCom = new ConcreteCompany("山東分公司");  
  8.         shandongCom.add(new HRDepartment("山東分公司人力資源部"));  
  9.         shandongCom.add(new FinanceDepartment("山東分公司賬務部"));  
  10.         Company zaozhuangCom = new ConcreteCompany("棗莊辦事處");  
  11.         zaozhuangCom.add(new FinanceDepartment(

    相關推薦

    結構模式組合模式(Composite Pattern)

    一、設計模式的分類 (如果以前看過關於設計模式的分類的話,這部分可以忽略!) 經過很多大神的總結,目前Java中一共23種經典的設計模式! 按照目的,設計模式可以分為以下三種用途: 1.建立型模式:用來處理物件的建立過程 2.結構型模式:用來處理類或者物件的組

    設計模式組合模式Composite Pattern

    import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; /** * 組合模式。 * @author Bright Lee */ public class CompositeP

    JAVA設計模式組合模式

    層次結構 lines end fadein java trac 抽象類 ddc 單個 組合(總體與部分關系)模式:將不同可是相關的對象組合成樹形結構以實現“部分-總體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。 * 模式角色組成:

    小白設計模式組合模式

    定義 將物件組合成樹形結構來表現出“整體/部分”的層次結構。組合能讓客戶以一致性的方式處理個別的物件以及物件組合。 主要組成 抽象元件(Component): 為組合中的物件(節點或者元件)宣告介面,也可提供預設的介面預設實現; 節點物件(Leaf): 組合中的葉節點物件,葉節點物件不再擁有子節點;

    設計模式組合模式

    組合模式非java核心中的組合。 組合模式的定義:把部分和整體關係用“樹形結構”來表示。從而使客戶端可用同一方式處理部分物件或整體物件。 樹形結構例子:比如平時的配置檔案xml, 檔案系統等   核心:   抽象角色:定義了葉子和容器構件的共同點。如檔案系統中檔案和資料夾的特性。   葉

    設計模式之八組合模式(Composite Pattern)

    數據結構 log ide ase 統一 etc 方法 可能 模式 什麽是組合模式呢?簡單來說組合模式就是將對象合成樹形結構以表示“部分整體”的層次結構,組合模式使用戶對單個對象和組合對象使用具有一致性。 組合模式(Composite Pattern)有時

    組合模式(Composite Pattern)(一)組合模式介紹

    一、意圖 將物件組合成樹形結構以表示“部分-整體”的層次結構。Composite模式使得使用者對單個物件和組合物件的使用具有一致性。 二、適用性 • 你想表示物件的部分-整體層次結構。 • 你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有

    結構模式組合模式防毒系統

    一、題目設計一款防毒軟體,客戶可以直接對檔案(ImageFile和TextFile)進行防毒也可以對某個指定資料夾(ImageFolder和TextFolder)下的檔案進行防毒。java實現Interface介面:public interface Interface {vo

    C#設計模式(10)——組合模式Composite Pattern

    詳細 ext bstr write move complex 存在 span remove 一、引言 在軟件開發過程中,我們經常會遇到處理簡單對象和復合對象的情況,例如對操作系統中目錄的處理就是這樣的一個例子,因為目錄可以包括單獨的文件,也可以包括文件夾,文件夾又是由文件組

    設計模式組合模式Composite Pattern

    組合模式(Composite Pattern),又叫部分整體模式,是用於把一組相似的物件當作一個單一的物件。組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。這種型別的設計模式屬於結構型模式,它建立了物件組的樹形結構。 介紹 意圖:將物件組合成樹形結構以表示"部分-整體"的層次結構。

    結構模式組合模式

    新的 http getch branch oot 調用 block 工業 等級 組合模式也叫合成模式,用來描述部分與整體的關系。 定義: 將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。 組合模式類圖如下所示。 組合模

    Java設計模式(九)之結構模式外觀模式

    一、定義: 所謂外觀模式,就是提供一個統一的介面,用來訪問子系統中的一群介面。 外觀模式定義了一個高層介面,讓子系統更容易使用。如下圖,是使用外觀模式後將子系統的使用變得更加簡單。 在引入外觀模式後,客戶只需要與外觀角色打交道,客戶與子系統的複雜關係由外觀角色來實現

    設計模式組合模式(結構)

    文章目錄 模式意圖 模式定義 模式角色 模式分析 實際例子 模式應用 模式意圖 介紹模式定義定義之前先介紹一下組合模式的意圖。其實就是將物件組合成整體-部

    Java設計模式8組合模式Composite

    組合模式(Composite) 意圖 將物件組合成樹形結構已表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性 適用性 1、你想表示物件的部分-整體層次i結構 2、你希望使用者忽略組合物件與單個休想的

    設計模式(結構)之裝飾者模式(Decorator Pattern)

    PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 概述 裝飾模式可以在不改變一個物件本身功能的基礎上給物件增加額外的新行為。裝飾模式是一種用於替代繼承的技術,它通過一

    結構模式之——組合模式

    結構型模式之 組合模式 前言 對於樹形結構,在程式碼中有容器節點和葉子節點之分,容器節點可以有子節點,而葉子節點沒有,所以兩者是有區分的,而在實際使用中,我們更希望一致的對待他們,因為如若區別對待,在程式上會非常複雜。組合模式則是為了解決此類問

    面向物件組合Composite模式

     以下內容來自http://www.lifevv.com 本文介紹設計模式中的組合(Composite)模式的概念,用法,以及實際應用中怎麼樣使用組合模式進行開發。 Composite模式的概念 Composite模式是構造型的設計模式之一,通過遞迴手

    設計模式(結構)之享元模式(Flyweight Pattern)

    PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 概述 當一個軟體系統在執行時產生的物件數量太多,將導致執行代價過高,帶來系統性能下降等問題。所以需要採用一個共享來避

    17 【結構模式組合模式

    定義  組合模式(Composite Pattern):組合多個物件形成樹形結構以表示具有“整體—部分”關係的層次結構。組合模式對單個物件(即葉子物件)和組合物件(即容器物件)的使用具有一致性,組合模式又可以稱為“整體—部分”(Part-Whole)模式,它是一種物件結構型模

    結構模式裝飾模式

    結果 什麽 inpu 不同的 滿足 裝飾模式 ebr pro 對象 文章首發: 結構型模式:裝飾模式 七大結構型模式之四:裝飾模式。 簡介 姓名 :裝飾模式 英文名 :Decorator Pattern 價值觀 :人靠衣裝,類靠裝飾 個人介紹 : Attach add