1. 程式人生 > >結構型模式之Composite模式

結構型模式之Composite模式

1、意圖

將物件組合成樹形結構以表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性。

2、適用性

以下情況使用Composite模式

(1)你想表示物件的部分-整體層次結構

(2)你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件

3、參與者

(1)Component:為組合中的物件宣告介面;在適當的情況下,實現所有類共有介面的預設行為;宣告一個介面用於訪問和管理Component的子元件;在遞迴結構中定義一個介面,用於訪問一個父部件,並在合適的情況下實現它。

(2)Leaf:在組合中表示葉節點物件,葉節點沒有子節點;在組合中定義圖元物件的行為

(3)Composite:定義有子部件的那些部件的行為;儲存子部件;在Component介面實現與與子部件有關的操作

(4)Client:通過Component介面操縱組合部件的物件。

UML類圖表示為


Java程式碼表示為:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javatest;

import java.util.List;
import java.util.ArrayList;

/*component*/ 
interface Graphics
{
    public void print();
}

/*composite*/
class CompositeGraphics implements Graphics
{
    private List<Graphics> childGraphics = new ArrayList<Graphics>();
    
    @Override
    public void print()
    {
        for (Graphics graphics:childGraphics) {
            graphics.print();
        }
    }
    
    public void add(Graphics graphics)
    {
        childGraphics.add(graphics);
    }
}

/*Leaf*/
class Ellipse implements Graphics
{
    @Override 
    public void print()
    {
        System.out.println("Ellipse");
    }
}

/*Client*/
public class JavaTest
{
    public static void main(String[] args)
    {
        Ellipse ellipse1 = new Ellipse();
        Ellipse ellipse2 = new Ellipse();
        Ellipse ellipse3 = new Ellipse();
        Ellipse ellipse4 = new Ellipse();
        
        CompositeGraphics graphics = new CompositeGraphics();
        CompositeGraphics graphics1 = new CompositeGraphics();
        CompositeGraphics graphics2 = new CompositeGraphics();
        
        graphics1.add(ellipse1);
        graphics1.add(ellipse2);
        graphics1.add(ellipse3);
        
        graphics2.add(ellipse4);
        
        graphics.add(graphics1);
        graphics.add(graphics2);
        
        graphics.print();
    }
}


4、協作 

使用者使用Component類介面與組合結構中的物件進行互動。如果接收者是葉節點,則直接處理請求,如果接收者是Composite,它通常將請求傳送給它的子部件,在轉發請求之前與/或之後可能執行一些輔助操作。

5、效果

(1)定義了包含基本物件和組合物件的類層次結構,基本物件可以被組合成更復雜的組合物件,而這個組合物件又可以被組合,這樣不斷的遞迴下去。客戶程式碼中,任何用到基本物件的地方都可以使用組合物件。

(2)簡化客戶程式碼,客戶可以一致地使用組合結構和單個物件。通常使用者不知道(也不關心)處理的是一個葉節點還是一個組合組合。這就簡化了客戶程式碼,因為在定義組合地那些類中不需要寫一些充斥著選擇語句 的函式

(3)使得更容易增加新型別的元件,新定義的Composite或Leaf子類自動地與已有的結構和客戶程式碼一起工作,客戶程式不需因新的Composite類而改變。

(4)使你的設計變得更加一般化,容易增加新元件也會產生一些問題,那就是很難限制組合中的元件。有時你希望一個組合中能有某些特定的組合 。使用Composite時,你不能依賴型別系統施加這些約束,而必須在執行時刻進行檢查。

6、相關模式

通常部件-父部件連線用於Responsibility of Chain 模式

Decorator模式經常與Composite模式一起使用。當裝飾和組合一起使用時,它們通常有一個公共的父類。因些裝飾必須支援具有Add、Remove和GetChild操作的Component介面。

Flyweight讓你共享元件,但不再能引用他們的父部件。

Iterator可用來遍歷Composite。

Visitor將本來應該分佈在Composite和Leaf類中的操作和行為區域性化。

相關推薦

結構模式Composite模式

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

【設計模式攻略】結構模式Composite模式

概要 具備一系列既有獨立功能,又需要排列組合其中的幾種功能來達成一些複合的新功能時,可以採用組合模式。比如說,你設計了一個備份模組,有email備份,note備份,message備份,log備份等一系列備份功能,而你又會需要同時備份它們中間不定的幾種時,考慮用組合模式吧。它能組合物件處理,而又不增加額外的耦

7 結構模式 - 裝飾模式

oid str res bstr 子類 protected eat 同時 jea 裝飾模式介紹:裝飾模式也稱為包裝模式,是結構型模式之一,其使用一種對客戶端透明的方式來動態地擴展對象的功能,同時它也是繼承關系的一種替代方案之一。在現實生活中你也可以看見很多裝飾模式的例子,或

結構模式 裝飾模式

res 松耦合 行為 父類 添加 class 但是 end bsp 裝飾模式(Decorator Pattern) :動態地給一個對象增加一些額外的職責(Responsibility),就增加對象功能來說,裝飾模式比生成子類實現更為靈活。其別名也可以稱為包裝器(Wrappe

設計模式的藝術 結構模式介面卡模式

不懂使用為學過,說出用途,繪製結構為了解,不會靈活使用基本等於沒學。 前言 有的筆記本工作電壓是20V,而中國家庭用電的電壓是220V,如何讓20V的筆記本在220V的電壓下工作,答案就是進入一個電源介面卡,這樣才能相容,在軟體開發中也有這種不相容的情況,這時候也可以像電源介面卡的方法一樣來

設計模式(10)—— 結構 ——組合(Composite

簡介 定義:將物件組合成樹形結構以表示“部分——整體”的層次結構。 說明:組合模式使客戶端對單個物件和組合物件保持一致的處理方式 型別:結構型 適用場景 希望客戶端可以忽略組合物件與單個物件的差異時 處理一

結構模式組合模式

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

結構模式裝飾模式

活性 @override java基礎 cor span decorator 不用 解決 system 裝飾模式(Decorator Pattern)是一種比較常見的模式。 定義: 動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模

結構模式外觀模式

1.模式定義 外觀模式(Facade Pattern) :外部與一個子系統的通訊必須通過一個統一的外觀物件進行,為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。外觀模式又稱為門面模式,它是一種物件結構

結構模式代理模式

6.1 模式動機: 在某些情況下,一個客戶不想或者不能直接引用一個物件,此時可以通過一個稱之為“代理”的第三者來實現間接引用。 代理物件可以在客戶端和目標物件之間起到中介的作用,並且可以通過代理物件去掉客戶不能看到的內容和服務或者新增客戶需要的額外服務。

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

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

結構模式——組合模式

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

設計模式介面卡模式結構,需要一個轉換頭,用來相容)

介紹 標準定義:將一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 通俗理解:我們日常用的讀卡器就是一個介面卡,記憶體卡不能直接插入筆記

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

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

GoF23種設計模式行為模式訪問者模式

部分 strong 操作 定義 狀態 arraylist his tro 不同的 概述 表示一個作用於某對象結構中的各元素的操作。 它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。 適用性 1.一個對象結構包含很多

設計模式組合模式 Composite

new private none 結點 strac protected () ati osi 代碼實現 //Component(抽象構件):抽象構件中定義了葉子和容器構件的共同點。比如,有公共的添加刪除葉子功能,有顯示節點功能。 public abstrac

Java設計模式(9)——創建模式裝飾模式

block 擴展 str 分享 增加 image tro col 技術 一、概述   動態地給一個對象添加一些額外的職責。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴展對象的功能。   UML簡圖      角

GOF23設計模式組合模式composite

ret blog 構建 樹狀結構 遍歷 合成 str 管理 rri 一、組合模式概述   將對象組合成樹狀結構以表示“部分和整體”層次結構,使得客戶可以統一的調用葉子對象和容器對象。   (1)組合模式的使用場景      把部分和整體的關系用樹形結構來表示,從而使客戶端

行為模式 狀態模式

out 包含 pst att con cts top image 我們 狀態模式(State Pattern) :允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。其別名為狀態對象(Objects for States),狀態模式是一種對象行為型模式。

java設計模式Composite Pattern(組合模式

In ima field 編程 這也 composite 當前 屬性 OS 組合模式是面向可維護性編程的一種常見的設計模式。簡單的說就是一個類裏面有一組當前類組成的collection作為這個類的屬性。這和遞歸有一定的相似。他的目的就是在同類型對象之間建立起樹形層次結構,一