1. 程式人生 > >COMPOSITE(組合) ---- 物件結構型模式

COMPOSITE(組合) ---- 物件結構型模式

[size=large]1、意圖
將物件組合成樹形結構以表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性。
2、動機
在繪圖編輯器和圖形捕捉系統這樣的圖形應用系統中,使用者可以使用簡單的元件建立複雜的圖示。使用者可以組合多個簡單元件以形成一些較大的元件,這些元件又可以組合成更大的元件。一個簡單的實現方法是為Text和Line這樣的圖元定義一些類,另外定義一些類作為這些圖元的容器類(Container)。
然而這種方法存在一個問題:使用這些類的程式碼必須區別對待圖元物件與容器物件,而實際上大多數情況下使用者認為它們是一樣的。對這些類區別對待,使得程式更加複雜。Composite模式描述瞭如何使用遞迴組合,使得使用者不比對這些類進行區別,如下圖所示。

[img]http://dl2.iteye.com/upload/attachment/0085/3438/4953de65-458a-3b1c-acd1-7e2b628eac82.jpg[/img]

Composite模式的關鍵是一個抽象類,它既可以代表圖元,又可以代表圖元的容器。在圖形系統中的這個類就是Graphic,它宣告一些與特定圖形物件相關的操作,例如Draw。同時它也聲明瞭所有的組合物件共享的一些操作,例如一些操作用於訪問和管理它的子部件。
子類Line、Rectangle和Text(參見前面的類圖)定義了一些圖元物件,這些類實現Draw,分別用於繪製直線、矩形和正文。由於圖元都沒有子圖形,因此它們都不執行與子類有關的操作。
Picture類定義了一個Graphic物件的聚合。Picture的Draw操作時通過對它的子部件呼叫Draw實現的,Picture還用這種方法實現了一些與其子部件相關的操作。由於Picture介面與Graphic介面是一致的,因此Picture物件可以遞迴地組合其它Picture物件。
下圖是一個典型的由遞迴組合的Graphic物件組成的組合物件結構。

[img]http://dl2.iteye.com/upload/attachment/0085/2730/a8c407d7-5700-32a0-9f64-174bb0cc68e7.jpg[/img]

3、適用性
以下情況使用Composite模式:
你想表示物件的部分-整體層次結構
你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的多有物件。
4、結構

[img]http://dl2.iteye.com/upload/attachment/0085/2722/b6fa568d-b048-33f5-8b86-98418bd97fd9.jpg[/img]

5、參與者
Component(Graphic)
----為組合中的物件宣告介面
----在適當的情況下,實現多有類共有介面的預設行為。
----宣告一個介面用於訪問和管理Component的子元件
----(可選)在遞迴結構中定義一個介面,用於訪問一個父部件,並在合適的情況下實現它。
Leaf(Rectangle、Line、Text等)
----在組合中表示葉節點物件,葉節點沒有子節點。
----在組合中定義圖元物件的行為。
Composite(Picture)
----定義有子部件的那些部件的行為
----儲存子部件
----在Component介面中實現與子部件的有關操作
Client
----通過Component介面操縱組合部件的物件。
6、協作
使用者使用Component類介面與組合結構中的物件進行互動。如果接收者是一個葉節點則直接處理請求。如果接收者是Composite,它通常將請求傳送給它的子部件,在轉發請求之前與/或之後可能執行一些輔助操作。
7、程式碼示例[/size]
/** "Component" */
interface Graphic {

//Prints the graphic.
public void print();
}

/** "Composite" */
import java.util.List;
import java.util.ArrayList;
class CompositeGraphic implements Graphic {

//Collection of child graphics.
private List<Graphic> childGraphics = new ArrayList<Graphic>();

//Prints the graphic.
public void print() {
for (Graphic graphic : childGraphics) {
graphic.print();
}
}

//Adds the graphic to the composition.
public void add(Graphic graphic) {
childGraphics.add(graphic);
}

//Removes the graphic from the composition.
public void remove(Graphic graphic) {
childGraphics.remove(graphic);
}
}

/** "Leaf" */
class Ellipse implements Graphic {

//Prints the graphic.
public void print() {
System.out.println("Ellipse");
}
}

/** Client */
public class Program {

public static void main(String[] args) {
//Initialize four ellipses
Ellipse ellipse1 = new Ellipse();
Ellipse ellipse2 = new Ellipse();
Ellipse ellipse3 = new Ellipse();
Ellipse ellipse4 = new Ellipse();

//Initialize three composite graphics
CompositeGraphic graphic = new CompositeGraphic();
CompositeGraphic graphic1 = new CompositeGraphic();
CompositeGraphic graphic2 = new CompositeGraphic();

//Composes the graphics
graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);

graphic2.add(ellipse4);

graphic.add(graphic1);
graphic.add(graphic2);

//Prints the complete graphic (four times the string "Ellipse").
graphic.print();
}
}

相關推薦

COMPOSITE(組合) ---- 物件結構模式

[size=large]1、意圖 將物件組合成樹形結構以表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性。2、動機 在繪圖編輯器和圖形捕捉系統這樣的圖形應用系統中,使用者可以使用簡單的元件建立複雜的圖示。使用者可以組合

composite - 物件結構模式

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

proxy -物件結構模式

        1.意圖                      為其它物件提供一種代理以控制對這個物件的訪問     &nbs

proxy -bc平臺出租物件結構模式

1.意圖                     為其它物件提供一種代理以控制對這個物件的訪問         2.參與者   

flyweight - 物件結構模式

    1.意圖      運用共享技術有效的支援大量細粒度的物件      2.參與者      Flyweight - 描述一個介面flyweight可以接受並作用於外部狀態  

facade - 物件結構模式

   1.意圖             為子系統提供一個一致的介面,facade模式定義了一個高層介面,這個介面使得             這一系統更加容易使

bridge - 物件結構模式

   1.意圖             將抽象部分和它的實現部分分離,使它們都可以獨立變化     2.參與者       Abstraction - 定義抽象介面 &n

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

public class Test { public static void main(String[] args) { Employer pm = new ProjectManager("專案經理"); Employer pa = new ProjectAssis

結構模式組合COMPOSITE

一、意圖 將物件組合成樹形結構以表示部分-整體層次結構,使得 單個元件與組合元件具有一致性。 二、圖解 上圖可知Line,Rectangle,Text屬於基本元件,而Picture可以對這些元件進行組合,需要什麼往容器新增什麼元件。一致性表

(結構模式)COMPOSITE——組合模式

1、意圖 組合模式:將物件組合成樹形結構以表示“部分——整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性 2、優缺點分析 GOOD:整體和部分可以被一致對待(如WORD中複製一個文字、一段文字、一篇文章都是一樣的操作) 使用者不用關心到底

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

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

設計模式-結構模式,python組合模式

%s spa 方向 main 具體類 向上 模式 python 應用 設計模式上大的方向上分繼承和組合,就是類模式和對象模式。此篇的組合模式非繼承和組合概念中的組合。橋接 策略 代理 裝飾者都用了組合,此組合非彼組合。 組合模式 組合模式(Composite Pa

第10章 結構模式組合模式

1. 組合模式(Composite Pattern)的定義 (1)將物件組合成樹型結構以表示“部分-整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。 (2)組合模式的結構和說明   ①Component:抽象的元件物件,為組合中的物件宣告介面,讓客戶端可以

面向物件設計的設計模式(二):結構模式(附 Demo & UML類圖)

本篇是面向物件設計系列文章的第三篇,講解的是設計模式中的結構型模式: 外觀模式 介面卡模式 橋接模式 代理模式 裝飾者模式 享元模式 該系列前面的兩篇文章: 面向物件設計的六大設計原則(附 Demo 及 UML 類圖) 面向物件設計的設計模式(一):建

結構模式組合模式

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

十三、結構模式----組合模式

一、組合模式 組合模式有時又叫部分-整體模式在處理類似樹形結構的問題時比較方便,看看關係圖: 直接來看程式碼: public class TreeNode { private String name; private TreeNode parent; private Ve

設計模式--結構模式--組合模式

//Structural Patterns--Composite //結構型模式--組合模式 //Component(抽象構件):為葉子構件和容器構件物件定義介面,可以包含所有子類共有行為的宣告和實現。在抽象構件中,聲明瞭訪問及管理子構件的介面(例如:Add()、Remo

結構模式-組合模式

  組合模式可以處理整體和部分的關係,如果整體和部分擁有相同的結構,最典型的如二叉樹,檔案系統   下面來看例子,公司,分公司,部門 package constructional.pattern.composite; /** * 檔名稱:design.composite.Company.java

結構模式Composite模式

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

結構模式之——組合模式

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