設計模式——組合模式

一、介紹

開發(fā)中經(jīng)常會遇到這樣一個需求,列表數(shù)據(jù)做多級顯示,對于整體——部分這類場景可以用組合模式來解決,提取出公共信息成立一個基類,多級結構分級成立不同的類,分別都繼承基類,實現(xiàn)基類中定義的方法,同時在各級子類中聚合基類,形成根節(jié)點中包含下一級根節(jié)點和葉子節(jié)點這種樹狀結構。

二、UML類圖

組合模式

這個例子中是需要展示學校下屬學院,學院下屬的系,多級分層全部顯示,這里提取出學校、學院、系的公共信息,包含了名字、添加和刪除操作,將這些公共信息成立一個基類Organization,同時定義一個print方法,需要各級機構去實現(xiàn),各級機構繼承基類的同時,還要聚合基類,這樣使得各級子結構可以添加、刪除自己的根節(jié)點和葉子節(jié)點,實現(xiàn)多級樹狀結構。

三、代碼示例

public abstract class Organization {

    private String mName;

    public Organization(String name) {
        this.mName = name;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name){
        mName = name;
    }

    protected void addOrganization(Organization organization){}

    protected void removeOrganization(Organization organization){}

    protected abstract void print();
}
public class University extends Organization{

    private final List<Organization> mOrganizations = new ArrayList<>();

    public University(String name) {
        super(name);
    }

    @Override
    protected void addOrganization(Organization organization) {
        super.addOrganization(organization);
        mOrganizations.add(organization);
    }

    @Override
    protected void removeOrganization(Organization organization) {
        super.removeOrganization(organization);
        mOrganizations.remove(organization);
    }

    @Override
    protected void print() {
        System.out.println("***********"+getName()+"***********");
        for (Organization organization : mOrganizations) {
            organization.print();
        }
    }
}
public class College extends Organization{

    private final List<Organization> mOrganizations = new ArrayList<>();

    public College(String name) {
        super(name);
    }

    @Override
    protected void addOrganization(Organization organization) {
        super.addOrganization(organization);
        mOrganizations.add(organization);
    }

    @Override
    protected void removeOrganization(Organization organization) {
        super.removeOrganization(organization);
        mOrganizations.remove(organization);
    }

    @Override
    protected void print() {
        System.out.println("  *********"+getName()+"*********  ");
        for (Organization organization : mOrganizations) {
            organization.print();
        }
    }
}
public class Department extends Organization{

    public Department(String name) {
        super(name);
    }

    @Override
    protected void print() {
        System.out.println("    *******"+getName()+"*******    ");
    }
}

組合模式關鍵在于提取公共信息成立一個基類,讓各級子類都去繼承這個基類,同時定義一個抽象方法,各級子類根據(jù)各自的業(yè)務去實現(xiàn)這個抽象方法,從而形成各級結構的差異化,子類聚合基類的處理方式使得系統(tǒng)實現(xiàn)層級結構。

四、總結

對于對數(shù)據(jù)需要進行整體——部分分層處理的這種場景,組合模式尤為合適,這種模式上層結構不需要關心下層處理的是單層對象還是組合對象,下層結果自行根據(jù)自己是根節(jié)點還是葉子節(jié)點去遞歸處理。在Java中HashMap這種常用的數(shù)據(jù)結構就是根據(jù)組合模式實現(xiàn)的。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 設計模式-組合模式 定義 我們知道古代的皇帝想要管理國家,是不可能直接管理到具體每一個老百姓的,因此設置了很多機構...
    RUMyCola閱讀 693評論 0 3
  • 組合模式(Composite) 在現(xiàn)實生活中,存在很多“部分-整體”的關系,例如,大學中的部門與學院、總公司中的部...
    Acton_zhang閱讀 511評論 0 1
  • 組合模式介紹 組合模式(Composite Pattern)也稱為部分整體模式(Part-Whole Patter...
    小的橘子閱讀 1,200評論 0 0
  • 在現(xiàn)實生活中,存在很多“部分-整體”的關系,例如,大學中的部門與學院、總公司中的部門與分公司、學習用品中的書與書包...
    木子教程閱讀 695評論 0 1
  • ??注意:如果不想浪費時間,請一定要點我。 ??在現(xiàn)實生活中,存在很多“部分-整體”的關系,例如,大學中的專業(yè)與學...
    布魯斯理閱讀 191評論 0 0

友情鏈接更多精彩內容