java23種設計模式——八、組合模式
目錄
java23種設計模式—— 一、設計模式介紹
java23種設計模式—— 二、單例模式
java23種設計模式——三、工廠模式
java23種設計模式——四、原型模式
java23種設計模式——五、建造者模式
java23種設計模式——六、適配器模式
java23種設計模式——七、橋接模式
java23種設計模式——八、組合模式
介紹
組合模式(Composite Pattern),又叫部分整體模式,是用於把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及整體層次。這種類型的設計模式屬於結構型模式,它創建了對象組的樹形結構。
這種模式創建了一個包含自己對象組的類。該類提供了修改相同對象組的方式。
組合模式類似樹形結構,上一層節點的包含多個下一層的節點,而下一層的節點只依附於一個上一層的節點。
實現
我們先來看下組合模式的角色。
- Component抽象構建角色,抽象共有的方法和屬性,
- Leaf葉子構件,葉子對象,沒有其他分支,類似於樹葉
- Composite數值構件,組合葉子和其他樹枝組合成一個完整的樹,類似於樹枝
通常大學裡都有很多個系,每個系又包含多個專業,每個專業也有多個班級。
首先有一個抽象學校類,即component角色
/**
* @author codermy
* @createTime 2020/7/28
*/
//學校
public abstract class School {
//展示樹形結構
public abstract void display(String f);
//添加分支
public void add(School branch){
throw new UnsupportedOperationException("不支援此功能");
};
//刪除分支
public void remove(School branch) {
// 若葉子對象沒有這個功能,或子類未實現這個功能
throw new UnsupportedOperationException("不支援此功能");
}
}
現在有一個Branch類(即Composite角色)繼承了學校類,並實現其中方法。我們可以把它抽象的想成,學校的分院與專業的結構都一樣,所以新建它們都公用這一個類
/**
* @author codermy
* @createTime 2020/7/28
* 分院
*/
public class Branch extends School {
//學校集合
private List<School> schoolList = new ArrayList<>();
private String name;
public Branch(String name){
this.name=name;
}
@Override
public void display(String f) {
System.out.println(f + name);
// 如果還包含其他子組件,那麼就輸出這些子組件對象
if (null != schoolList) {
// 添加一個空格,表示向後縮進一個空格
f += "---";
// 輸出當前對象的子組件對象
for (School school : schoolList) {
// 遞歸地進行子組件相應方法的調用,輸出每個子組件對象
school.display(f);
}
}
}
public void add(School branch){
schoolList.add(branch);
}
public void remove(School branch){
schoolList.remove(branch);
}
}
而學校里最小的單元是班級,新建這個類(即Leaf)
/**
* @author codermy
* @createTime 2020/7/28
*/
public class Class extends School {
private String name;
public Class(String name){
this.name = name;
}
@Override
public void display(String f) {
System.out.println(f + "-"+ name);
}
}
client類測試
/**
* @author codermy
* @createTime 2020/7/28
*/
public class Client {
public static void main(String[] args) {
//新建一個學校
School university = new Branch("南京大學");
//新建分院
School branch1 = new Branch("電腦與軟體學院");
School branch2 = new Branch("外國語學院");
//新建專業
School profession1 = new Branch("軟體工程");
School profession2 = new Branch("網路工程");
//新建班級
profession1.add(new Class("軟體1801"));
profession1.add(new Class("軟體1802"));
branch1.add(profession1);
branch1.add(profession2);
university.add(branch1);
university.add(branch2);
university.display("-");
}
}
輸出
-南京大學
----電腦與軟體學院
-------軟體工程
-----------軟體1801
-----------軟體1802
-------網路工程
----外國語學院
優缺點
優點:
- 1、高層模組調用簡單。
- 2、節點自由增加。
- 3、可以清楚地定義分層次的複雜對象,表示對象的全部或部分層次,使得增加新構件也更容易。
缺點:
- 1、在使用組合模式時,其葉子和樹枝的聲明都是實現類,而不是介面,違反了依賴倒置原則。
- 2、使設計變得更加抽象,對象的業務規則如果很複雜,則實現組合模式具有很大挑戰性。