設計模式系列(結構型模式)之四 組合模式

2021-10-24 03:12:17 字數 2015 閱讀 7294

將物件組合成樹形結構以表示「部分-整體」的層次結構,使客戶端對單個物件和組合物件保持一致的方式處理。

適用於:

客戶端可以忽略組合物件與單個物件的差異;

處理樹形結構資料。

優點:層次清晰;

客戶端不必關係層次差異,方便控制;

符合開閉原則。

缺點:樹形處理較為複雜。

組合模式分為透明式的組合模式和安全式的組合模式。

(1) 透明方式:在該方式中,由於抽象構件宣告了所有子類中的全部方法,所以客戶端無須區別樹葉物件和樹枝物件,對客戶端來說是透明的。但其缺點是:樹葉構件本來沒有 add()、remove() 及 getchild() 方法,卻要實現它們(空實現或拋異常),這樣會帶來一些安全性問題。

(2) 安全方式:在該方式中,將管理子構件的方法移到樹枝構件中,抽象構件和樹葉構件沒有對子物件的管理方法,這樣就避免了上一種方式的安全性問題,但由於葉子和分支有不同的介面,客戶端在呼叫時要知道樹葉物件和樹枝物件的存在,所以失去了透明性。

主要場景:

1.在需要表示乙個物件整體與部分的層次結構的場合。

2.要求對使用者隱藏組合物件與單個物件的不同,使用者可以用統一的介面使用組合結構中的所有物件的場合

組合模式包含以下主要角色。

抽象構件(component)角色:它的主要作用是為樹葉構件和樹枝構件宣告公共介面,並實現它們的預設行為。在透明式的組合模式中抽象構件還宣告訪問和管理子類的介面;在安全式的組合模式中不宣告訪問和管理子類的介面,管理工作由樹枝構件完成。

樹葉構件(leaf)角色:是組合中的葉節點物件,它沒有子節點,用於實現抽象構件角色中 宣告的公共介面。

樹枝構件(composite)角色:是組合中的分支節點物件,它有子節點。它實現了抽象構件角色中宣告的介面,它的主要作用是儲存和管理子部件,通常包含 add()、remove()、getchild() 等方法。

舉個去耐克店買衣服的例子:

1.定義乙個抽象構件物品,裡面有顯示和計算兩個抽象方法

public

abstract

class

article

2.建立樹葉構件商品goods,繼承自抽象構件物品article ,裡面有商品的名字,數量,單價等基本屬性,並重新繼承的抽象方法

public

class

goods

extends

article

@override

public

void

show()

@override

public

float

calculation()

}

3.建立樹枝構件,袋子bag,繼承自抽象構件物品article ,通過用arraylist陣列來實現儲存和管理樹葉構件

public

class

bagextends

article

public

void

add(article a)

public

void

remove

(article a)

public article getchild

(int i)

@override

public

void

show()

}@override

public

float

calculation()

return p;

}}

4.測試輸出

public

class

test}/*

您選擇的商品有:

耐克鞋(數量:1,單價:500.0元)

上衣(數量:2,單價:100.0元)

褲子(數量:2,單價:200.0元)

襪子(數量:3,單價:10.0元)

總價:1130.0元

*/

結構型模式(4) 組合模式

有時又叫作部分 整體模式,它是一種將物件組合成樹狀的層次結構的模式,用來表示 部分 整體 的關係,使使用者對單個物件和組合物件具有一致的訪問性。優點 組合模式使得客戶端 可以一致地處理單個物件和組合物件,無須關心自己處理的是單個物件,還是組合物件,這簡化了客戶端 更容易在組合體內加入新的物件,客戶端...

結構型模式之三 組合模式

組合模式 composite pattern 組合多個物件形成樹形結構以表示 整體 部分 的結構層次。組合模式對單個物件和組合物件的使用具有一致性。屬於物件結構模式,它將物件組織到樹結構中,可以用來描述整體部分的關係。抽象構件可以是介面或抽象類,為葉子構件和容器構件物件宣告介面,在該角色中可以包含所...

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

傳統方案解決學校院系展示存在的問題分析 1 將學院看做是學校的子類,系是學院的子類,這樣實際上是站在組織大小來進行分層次的 2 實際上我們的要求 是 在乙個頁面中展示出學校的院系組成,乙個學校有多學院,乙個學院有多個系,因此這種方案,不能很好實現 的管理的 操作,比如對學院 系的新增,刪除,遍歷等 ...