定義與特點
組合(Composite Pattern)模式:有時又叫作整體-部分(Part-Whole)模式,它是一種将對象組合成樹狀的層次結構的模式,用來表示“整體-部分”的關系,使使用者對單個對象群組合對象具有一緻的通路性,屬于結構型設計模式。
組合模式包含以下主要角色。
- 抽象構件(Component)角色:它的主要作用是為樹葉構件和樹枝構件聲明公共接口,并實作它們的預設行為。在透明式的組合模式中抽象構件還聲明通路和管理子類的接口;在安全式的組合模式中不聲明通路和管理子類的接口,管理工作由樹枝構件完成。(總的抽象類或接口,定義一些通用的方法,比如新增、删除)
- 樹葉構件(Leaf)角色:是組合中的葉節點對象,它沒有子節點,用于繼承或實作抽象構件。
- 樹枝構件(Composite)角色 / 中間構件:是組合中的分支節點對象,它有子節點,用于繼承和實作抽象構件。它的主要作用是存儲和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
組合模式的主要優點有:
- 組合模式使得用戶端代碼可以一緻地處理單個對象群組合對象,無須關心自己處理的是單個對象,還是組合對象,這簡化了用戶端代碼;
- 更容易在組合體内加入新的對象,用戶端不會因為加入了新的對象而更改源代碼,滿足“開閉原則”;
其主要缺點是:
- 設計較複雜,用戶端需要花更多時間理清類之間的層次關系;
- 不容易限制容器中的構件;
- 不容易用繼承的方法來增加構件的新功能;
UML圖與代碼
**
* 抽象構件:物品
* @author: mxb
* @date: 2021/10/18 16:03
*/
public interface Articles {
/**
* 計算
* @return
*/
float calculation();
/**
* 輸出
*/
void show();
}
/**
* 樹枝構件:袋子
* @author: mxb
* @date: 2021/10/18 16:06
*/
public class Bags implements Articles {
private String bagName;
private ArrayList<Articles> bags = new ArrayList();
public Bags(String bagName) {
this.bagName = bagName;
}
public void add(Articles c) {
bags.add(c);
}
public void remove(Articles c) {
bags.remove(c);
}
public Articles getChild(int i) {
return bags.get(i);
}
@Override
public float calculation() {
float s = 0;
for (Object obj : bags) {
s += ((Articles) obj).calculation();
}
return s;
}
@Override
public void show() {
for (Object obj : bags) {
((Articles) obj).show();
}
}
}
/**
* 樹葉構件:商品
* @author: mxb
* @date: 2021/10/18 16:04
*/
public class Goods implements Articles{
private String goodsName;
private int quantity;
private float unitPrice;
public Goods(String goodsName, int quantity, float unitPrice) {
this.goodsName = goodsName;
this.quantity = quantity;
this.unitPrice = unitPrice;
}
@Override
public float calculation() {
return quantity * unitPrice;
}
@Override
public void show() {
System.out.println(goodsName + "(數量:" + quantity + ",單價:" + unitPrice + "元)");
}
}