0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

組合模式應(yīng)該怎么用

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 10:37 ? 次閱讀

相信樹形結(jié)構(gòu)大家都知道,但是是否知道用到了什么設(shè)計(jì)模式嗎?

1、什么是組合模式?

Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.

組合模式(Composite Pattern):將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu), 使得用戶對單個(gè)對象和組合對象的使用具有一致性。

說人話:用于處理樹形結(jié)構(gòu)數(shù)據(jù)。

2、組合模式定義

圖片

①、Component 抽象構(gòu)件角色

定義參加組合對象的共有方法和屬性,可以定義一些默認(rèn)的行為或?qū)傩浴?/p>

②、Leaf 葉子節(jié)點(diǎn)

葉子對象,其下再也沒有其他的子節(jié)點(diǎn),是遍歷的最小單位。

③、Composite 樹枝構(gòu)件

樹枝對象,作用是組合樹枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)形成一個(gè)樹形結(jié)構(gòu)。

3、組合模式通用代碼實(shí)現(xiàn)

/**
 * 個(gè)體和整體的抽象
 */
public abstract class Component {
    // 個(gè)體和整體都有的共享
    public void doSomething(){
        // 通用業(yè)務(wù)邏輯
        System.out.println("通用業(yè)務(wù)邏輯");
    }
}
/**
 * 樹枝節(jié)點(diǎn)
 */
public class Composite extends Component{
    // 構(gòu)件容器
    private ArrayList< Component > componentArrayList = new ArrayList<  >();

    // 增加一個(gè)葉子節(jié)點(diǎn)或者樹枝節(jié)點(diǎn)
    public void add(Component component){
        this.componentArrayList.add(component);
    }

    // 刪除一個(gè)葉子節(jié)點(diǎn)或者樹枝節(jié)點(diǎn)
    public void remove(Component component){
        this.componentArrayList.remove(component);
    }

    // 獲取分支下所有葉子節(jié)點(diǎn)和樹枝節(jié)點(diǎn)
    public List< Component > getChildren(){
        return this.componentArrayList;
    }
}
/**
 * 葉子節(jié)點(diǎn)
 */
public class Leaf extends Component {

    // 覆寫父類方法
    @Override
    public void doSomething() {
        // 葉子節(jié)點(diǎn)邏輯
        System.out.println("葉子節(jié)點(diǎn)邏輯");
    }
}

測試:

public class ClientTest {

    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)根節(jié)點(diǎn)
        Composite root = new Composite();
        root.doSomething();
        // 創(chuàng)建一個(gè)樹枝構(gòu)件
        Composite branch = new Composite();
        // 創(chuàng)建一個(gè)葉子節(jié)點(diǎn)
        Leaf leaf = new Leaf();

        // 串聯(lián)起來
        root.add(branch);
        branch.add(leaf);

        display(root);
    }

    // 通過遞歸遍歷數(shù)
    public static void display(Composite root){
        for(Component c : root.getChildren()){
            if(c instanceof Leaf){ // 葉子節(jié)點(diǎn)
                c.doSomething();
            }else{
                display((Composite) c);
            }
        }
    }
}

這里我們在舉一個(gè)例子:

假設(shè)我們在開發(fā)一個(gè) OA 系統(tǒng)(辦公自動(dòng)化系統(tǒng))。公司的組織結(jié)構(gòu)包含部門和員工兩種數(shù)據(jù)類型。其中,部門又可以包含子部門和員工。

我們希望在內(nèi)存中構(gòu)建整個(gè)公司的人員架構(gòu)圖(部門、子部門、員工的隸屬關(guān)系),并且提供接口計(jì)算出部門的薪資成本(隸屬于這個(gè)部門的所有員工的薪資和)。

圖片

/**
 * 部門類和員工類的抽象類
 */
public abstract class HumanResource {
    protected long id;
    protected double salary;

    public HumanResource(long id){
        this.id = id;
    }

    public long getId(){
        return id;
    }

    public abstract double calculateSalary();

}
public class Department extends HumanResource{
    private List< HumanResource > subNodes = new ArrayList<  >();

    public Department(long id){
        super(id);
    }

    @Override
    public double calculateSalary() {
        double totalSalary = 0d;
        for (HumanResource hr : subNodes){
            totalSalary += hr.calculateSalary();
        }
        this.salary = totalSalary;
        return totalSalary;
    }

    public void addSubNode(HumanResource humanResource){
        subNodes.add(humanResource);
    }
}
public class Employee extends HumanResource{
    public Employee(long id,double salary){
        super(id);
        this.salary = salary;
    }

    @Override
    public double calculateSalary() {
        return salary;
    }
}

測試:

public class PersonClientTest {
    private static final long ORGANIZATION_ROOT_ID = 1;

    public static void main(String[] args) {
        // 創(chuàng)建總部門
        Department root = new Department(ORGANIZATION_ROOT_ID);

        // 創(chuàng)建子部門
        Department branch = new Department(2L);

        // 創(chuàng)建員工
        Employee employee1 = new Employee(21L,2000);
        Employee employee2 = new Employee(22L,4000);

        root.addSubNode(branch);
        branch.addSubNode(employee1);
        branch.addSubNode(employee2);

        double v = root.calculateSalary();
        System.out.println(v);
    }

    private void buildOrganization(Department department){
        // 根據(jù) 部門id 查詢數(shù)據(jù)庫 所有下屬部門 id
        // List< Long > subDepartmentIds = departmentRepo.getSubDepartmentIds(department.getId());
        List< Long > subDepartmentIds = new ArrayList<  >();

        for (Long subDepartmentId : subDepartmentIds){
            Department subDepartment = new Department(subDepartmentId);
            department.addSubNode(subDepartment);
            buildOrganization(subDepartment);
        }

        // 根據(jù)部門id 查詢數(shù)據(jù)庫 其關(guān)聯(lián)員工所有 id
        // List< Long > employeeIds = employeeRepo.getDepartmentEmployeeIds(department.getId());
        List< Long > employeeIds = new ArrayList<  >();
        for (Long employeeId : employeeIds){
            // 根據(jù) employeeId 查詢數(shù)據(jù)庫得到 salary
            // 假設(shè)為 1000
            double salary = 1000d;
            department.addSubNode(new Employee(employeeId,salary));
        }


    }
}

4、組合模式優(yōu)點(diǎn)

①、高層模塊調(diào)用簡單

一棵樹形機(jī)構(gòu)中的所有節(jié)點(diǎn)都是Component, 局部和整體對調(diào)用者來說沒有任何區(qū)別,也就是說, 高層模塊不必關(guān)心自己處理的是單個(gè)對象還是整個(gè)組合結(jié)構(gòu), 簡化了高層模塊的代碼。

②、節(jié)點(diǎn)自由增加

使用了組合模式后, 如果想增加一個(gè)樹枝節(jié)點(diǎn)、 葉子節(jié)點(diǎn)都很容易, 只要找到它的父節(jié)點(diǎn)就成, 非常容易擴(kuò)展, 符合開閉原則, 對以后的維護(hù)非常有利。

5、組合模式應(yīng)用場景

只要是樹形結(jié)構(gòu),就可以考慮使用組合模式。

①、維護(hù)和展示部分-整體關(guān)系的場景, 如樹形菜單、 文件和文件夾管理。

②、從一個(gè)整體中能夠獨(dú)立出部分模塊或功能的場景

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8677

    瀏覽量

    151592
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7115

    瀏覽量

    89332
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    498

    瀏覽量

    22089
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4814

    瀏覽量

    68849
收藏 人收藏

    評論

    相關(guān)推薦

    模式 PFC + 電流模式 LLC 組合控制器

    1. 簡介 [HR1211]是一款集成了多模式 PFC 和電流模式 HB LLC 的組合控制器,它性能卓越,具體參數(shù)請參閱 HR1211 數(shù)據(jù)手冊。 *附件:多模式 PFC + 電流
    的頭像 發(fā)表于 06-04 16:46 ?7944次閱讀
    多<b class='flag-5'>模式</b> PFC + 電流<b class='flag-5'>模式</b> LLC <b class='flag-5'>組合</b>控制器

    [5.1.1]--5.1組合模式_clip001

    組合導(dǎo)航組合導(dǎo)航系統(tǒng)
    jf_75936199
    發(fā)布于 :2023年03月10日 22:57:12

    [5.1.1]--5.1組合模式_clip002

    組合導(dǎo)航組合導(dǎo)航系統(tǒng)
    jf_75936199
    發(fā)布于 :2023年03月10日 22:57:53

    匹配模式拆分組合字符串

    匹配模式拆分組合字符串,大家可以參考一下!
    發(fā)表于 12-11 14:09

    AD轉(zhuǎn)換ADC1的兩個(gè)通道應(yīng)該設(shè)置成什么模式?

    請問,我現(xiàn)在有兩個(gè)地方需要用AD轉(zhuǎn)換,可以ADC1的兩個(gè)通道嗎?如果可以,那么這兩個(gè)通道應(yīng)該設(shè)置成什么模式?
    發(fā)表于 05-27 10:49

    請問CH375只直通電源模式應(yīng)該怎么接?

    CH375只直通電源模式應(yīng)該怎么接,是不是VSW、VDCID、VDCIA可以直接加一個(gè)0.1uF 電容接3.3V。這點(diǎn)沒看明白。官方有沒有這種的原理圖可供參考。謝謝
    發(fā)表于 06-27 07:20

    在FPGA中何時(shí)組合邏輯或時(shí)序邏輯

    的。話不多說,上貨。 在FPGA中何時(shí)組合邏輯或時(shí)序邏輯 在設(shè)計(jì)FPGA時(shí),大多數(shù)采用Verilog HDL或者VHDL語言進(jìn)行設(shè)計(jì)(本文重點(diǎn)以verilog來做介紹)。設(shè)計(jì)的電路都是利用
    發(fā)表于 03-06 16:31

    多重分形研究元素的共生組合

    應(yīng)用分形理論來研究測區(qū)內(nèi)元素在土壤中富集組合關(guān)系以及相關(guān)關(guān)系,并在此基礎(chǔ)上多重分形算法,對數(shù)據(jù)進(jìn)行處理,作出了元素的趨勢圖,判定了元素的共生組合性,為進(jìn)一步
    發(fā)表于 03-02 22:00 ?8次下載

    迷你組合音響的音場模式

    迷你組合音響的音場模式              音場的模式不是為了真實(shí)的再現(xiàn)錄音時(shí)的聲音,而是讓聲音更能符合收聽者
    發(fā)表于 01-04 15:05 ?1086次閱讀

    基于分層組合模式的句子組合模型

    閱讀理解任務(wù)需要綜合運(yùn)用文本的表示、理解、推理等自然語言處理技術(shù)。針對高考語文中文學(xué)作品閱讀理解的選項(xiàng)題問題,提出了基于分層組合模式的句子組合模型,用來實(shí)現(xiàn)句子級的語義一致性計(jì)算。首先,通過單個(gè)詞
    發(fā)表于 12-01 13:38 ?0次下載
    基于分層<b class='flag-5'>組合</b><b class='flag-5'>模式</b>的句子<b class='flag-5'>組合</b>模型

    手機(jī)上的后置多攝組合有什么?購機(jī)時(shí)應(yīng)該怎么選擇?

    現(xiàn)在采用后置多攝組合的手機(jī)太常見了,好像沒有后置多攝都不好意思說是一臺手機(jī)。手機(jī)上的后置多攝組合有什么?購機(jī)時(shí)應(yīng)該怎么選擇?我們一起通過文章來了解一下。
    的頭像 發(fā)表于 09-07 17:13 ?4457次閱讀

    STM32單片機(jī)的八種IO口模式,你應(yīng)該了解下

    STM32單片機(jī)的八種IO口模式,你應(yīng)該了解下
    發(fā)表于 11-26 17:21 ?12次下載
    STM32單片機(jī)的八種IO口<b class='flag-5'>模式</b>,你<b class='flag-5'>應(yīng)該</b>了解下

    組合模式(Composite Pattern)的用法

    組合模式主要是為了表達(dá)“部分-整體”的層次結(jié)構(gòu),例如公司的組織架構(gòu),每個(gè)部門下又有若干個(gè)下級部門,再如菜單結(jié)構(gòu),每個(gè)菜單下可能有一個(gè)或多個(gè)子菜單。
    的頭像 發(fā)表于 06-01 15:30 ?733次閱讀
    <b class='flag-5'>組合</b><b class='flag-5'>模式</b>(Composite Pattern)的用法

    設(shè)計(jì)模式結(jié)構(gòu)性:組合模式

    組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的對象當(dāng)作一個(gè)單一的對象。
    的頭像 發(fā)表于 06-08 10:34 ?1262次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>結(jié)構(gòu)性:<b class='flag-5'>組合</b><b class='flag-5'>模式</b>

    設(shè)計(jì)模式結(jié)構(gòu)性:橋接模式

    橋接模式不是將兩個(gè)不相干的類鏈接,而是將一個(gè)需要多維度變化的類拆分成抽象部分和實(shí)現(xiàn)部分,并且在抽象層對兩者做組合關(guān)聯(lián),是組合的方式來解決繼承的問題。
    的頭像 發(fā)表于 06-08 10:49 ?841次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>結(jié)構(gòu)性:橋接<b class='flag-5'>模式</b>