什么是組合模式
“組合模式”也被稱為“部分整體模式”該模式屬于結構型模式的一種。
講解該模式之前先帶大家熟悉一下“樹形結構”。相信大家對“樹形結構”不會太陌生,如果你剛好不太了解的話可以想一下大樹,一顆樹它分別有樹根、樹枝、樹葉,正好樹形結構中也有根節點、子節點(非葉子節點)、葉子節點。
組合模式就運用了樹形結構,該模式的核心思想是:將多個對象組合成樹形結構,以此結構來表示“整體-部分”之間的層次關系。
組合模式UML類圖
UML類圖講解:
1、Component:組合模式中的“根節點”,可以是接口、抽象類、普通類,該類中定義了其子類的所有共性內容,并且該類中還存在著用于訪問和管理它子部件的方法。
2、Leaf:組合中的葉子節點,也就是最末端的節點,該節點下不會再有子節點。
3、Composite:非葉子節點,它的作用是存儲子部件,并且在Composite中實現了對子部件的相關操作。
通過案例了解組合模式
案例:某公司老板需要開發一個人員和部門管理系統,要求是可以靈活的新增、刪除、展示部門以及部門下的員工。此時我們就可以通過組合模式來實現。
組織構成 => 對應Component角色
public abstract class OrganizationComponent {
// 名稱
private String name;
// 描述
private String describe;
/**
* 顯示方法
* 該方法不論是子節點還是葉子節點都需要,所以將其設計成抽象方法讓子類自行實現。
*/
public abstract void show();
/**
* 新增方法
* 因為葉子節點不需要該方法,所以將該方法寫成一個空實現方法,這樣葉子節點繼承該類時就不會被迫實現不需要的方法了。
*/
public void add(OrganizationComponent component) {
throw new UnsupportedOperationException();
}
/**
* 刪除方法
* 同add()方法一樣設計為空實現。
*/
public void remove(OrganizationComponent component) {
throw new UnsupportedOperationException();
}
... get()、set()、有參構造方法
}
公司 => 對應Composite角色
public class Company extends OrganizationComponent {
// components的作用就是,管理公司下的部門,也就是公司下的子節點。
private List<OrganizationComponent> components = new ArrayList<>();
... 有參構造方法
/**
* 重寫添加方法
*/
@Override
public void add(OrganizationComponent component) {
this.components.add(component);
}
/**
* 重寫刪除方法
*/
@Override
public void remove(OrganizationComponent component) {
this.components.remove(component);
}
/**
* 實現顯示方法
*/
@Override
public void show() {
// 打印公司名稱
System.out.println("======" + "名稱:" + this.getName() + " 描述:" + this.getDescribe() + "======");
// 打印公司下的子節點
for (OrganizationComponent component : components) {
component.show();
}
}
}
部門 => 對應Composite角色
public class Department extends OrganizationComponent {
// components的作用就是,管理部門下的員工,也就是部門下的子節點。
private List<OrganizationComponent> components = new ArrayList<>();
... 有參構造方法
/**
* 重寫添加方法
*/
@Override
public void add(OrganizationComponent component) {
this.components.add(component);
}
/**
* 重寫刪除方法
*/
@Override
public void remove(OrganizationComponent component) {
this.components.remove(component);
}
/**
* 實現顯示方法
*/
@Override
public void show() {
// 打印部門名稱
System.out.println("======" + "名稱:" + this.getName() + " 描述:" + this.getDescribe() + "======");
// 打印部門下的子節點
for (OrganizationComponent component : components) {
component.show();
}
}
}
員工 => 對應的是Leaf角色
public class Workers extends OrganizationComponent {
... 有參構造方法 /**
* 實現顯示方法
*/
@Override
public void show() {
System.out.println("名稱:" + this.getName() + " 描述:" + this.getDescribe());
}}
客戶端測試類
public class Client {
public static void main(String[] args) { // 公司 OrganizationComponent company = new Company("小菜鳥公司", "從不加加班的公司");
// 部門 OrganizationComponent department = new Department("研發部", "一個神奇的部門");
// 公司下添加部門 company.add(department); // 員工 department.add(new Workers("大牛", "上班摸摸魚"));
department.add(new Workers("小菜鳥一號", "天天CRUD"));
// 輸出 company.show(); }}
執行結果
圖片:執行結果圖
總結
1、使用組合模式可以讓用戶可以使用統一的方式處理整個樹形結構的個別對象和組合對象,從而簡化客戶端的操作。
2、組合模式具有較強的擴展性,當我們想要更改組合對象時,只需要調整內部的層次關系即可,客戶端不需要作出任何改動。
3、客戶端不用考慮組合中的細節,通過添加節點和葉子就可以創建出復雜的樹形結構。
4、當需要處理的對象是樹形結構時可以考慮使用組合模式。
5、節點和葉子節點存在很大差異的情況下不建議使用組合模式。
今天的分享就到這里了,如果感覺“菜鳥”寫的文章還不錯,記得點贊加關注呦!你們的支持就是我堅持下去的動力。文章哪里寫的有問題的也希望大家可以指出,我會虛心受教。