首页 > 其他分享 >组合模式揭秘:如何构建可扩展的树形结构

组合模式揭秘:如何构建可扩展的树形结构

时间:2023-12-20 13:32:46浏览次数:33  
标签:leaderName String orgName public 树形 构建 AbstractOrganization 构件 揭秘

组合模式揭秘:如何构建可扩展的树形结构_组合模式

什么是组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的关系。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。

组合模式的核心原理

组合模式的核心原理是将对象组合成树形结构以表示“部分-整体”的层次结构,从而使得用户对单个对象和组合对象的使用具有一致性。

具体来说,组合模式的核心是定义包含自身对象的集合,从而形成树的结构,让每个节点都有同样的元素和操作。这种模式适用于所有需要有层次结构的场景,包括文件结构、树形菜单等。

组合模式由三个核心角色构成:

  1. 抽象构件(AbstractComponent)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)
  2. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
  3. 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

组合模式揭秘:如何构建可扩展的树形结构_树形结构_02

组合模式如何实现

这里举一个例子来说明如何实现组合模式以及组合模式的适用场景。

组合模式揭秘:如何构建可扩展的树形结构_设计模式_03

比如XXX上市的科技公司的组织架构如上图,需要展示一下它的的组织架构,这个程序应该怎么写呢?这个场景就比较适合使用组合模式,先来画一下UML类图:

  1. AbstractOrganization:抽象组织类,属于抽象构件角色,定义了树叶构件、树枝构件的共同行为;
  2. Company、BranchCompany:总公司实体类、分公司实体类,继承于抽象组织类,属于树枝构件角色,树枝构件与树叶构件最明显的区别就是,树枝构件中包含有子节点,另外还添加、移除子节点构件的能力;
  3. Department:部门实体类,继承于抽象组织类,属于树叶节点构件,树叶节点构件没有子节点,所以也就没有必要重写添加、移除子节点的方法;
/** 
* 抽象组织,抽象构件(AbstractComponent)角色 
*/
public abstract class AbstractOrganization {    /**
     * 组织名称
     *
     * @return
     */
    public abstract String getOrgName();

    /**
     * 组织实际领导
     *
     * @return
     */
    public abstract String getLeaderName();

    /**
     * 添加组织
     *
     * @param abstractOrganization
     */
    public void add(AbstractOrganization abstractOrganization) {
    }

    /**
     * 移除组织
     *
     * @param abstractOrganization
     */
    public void remove(AbstractOrganization abstractOrganization) {
    }

    /**
     * 组织信息展示
     */
    public void show() {
    }
}
/** 
* 分公司 ,树枝构件(Composite)角色 
*/
public class BranchCompany extends AbstractOrganization {    
    /**
     * 组织名称
     */
    private String orgName;
    /**
     * 组织实际领导
     */
    private String leaderName;
    private List<AbstractOrganization> organizations = new ArrayList<>();

    public BranchCompany(String orgName, String leaderName) {
        this.orgName = orgName;
        this.leaderName = leaderName;
    }

    @Override
    public String getOrgName() {
        return this.orgName;
    }

    @Override
    public String getLeaderName() {
        return this.leaderName;
    }

    @Override
    public void add(AbstractOrganization abstractOrganization) {
        this.organizations.add(abstractOrganization);
    }

    @Override
    public void remove(AbstractOrganization abstractOrganization) {
        this.organizations.remove(abstractOrganization);
    }

    @Override
    public void show() {
        System.out.println("公司名称:" + this.orgName + ",主要领导:" + this.leaderName);
        for (AbstractOrganization organization : organizations) {
            organization.show();
        }
    }
}

/** 
* 总公司 ,树枝构件(Composite)角色 
*/
public class Company extends AbstractOrganization {    private List<AbstractOrganization> organizations = new ArrayList<>();
    /**
     * 组织名称
     */
    private String orgName;
    /**
     * 组织实际领导
     */
    private String leaderName;

    public Company(String orgName, String leaderName) {
        this.orgName = orgName;
        this.leaderName = leaderName;
    }

    @Override
    public String getOrgName() {
        return this.orgName;
    }

    @Override
    public String getLeaderName() {
        return this.leaderName;
    }

    @Override
    public void add(AbstractOrganization abstractOrganization) {
        this.organizations.add(abstractOrganization);
    }

    @Override
    public void remove(AbstractOrganization abstractOrganization) {
        this.organizations.remove(abstractOrganization);
    }

    @Override
    public void show() {
        System.out.println("公司名称:" + this.orgName + ",主要领导:" + this.leaderName);
        for (AbstractOrganization organization : organizations) {
            organization.show();
        }
    }
}
/** 
* 部门 ,树叶构件(Leaf)角色 
*/
public class Department extends AbstractOrganization {    /**
     * 组织名称
     */
    private String orgName;
    /**
     * 组织实际领导
     */
    private String leaderName;

    public Department(String orgName, String leaderName) {
        this.orgName = orgName;
        this.leaderName = leaderName;
    }

    @Override
    public String getOrgName() {
        return this.orgName;
    }

    @Override
    public String getLeaderName() {
        return this.leaderName;
    }

    @Override
    public void show() {
        System.out.println("部门名称:" + this.orgName + ",主要领导:" + this.leaderName);
    }
}
public class Test {
    public static void main(String[] args) {
        AbstractOrganization huawei = new Company("华为科技", "任正非");
        AbstractOrganization henan = new BranchCompany("河南分公司", "张三");
        huawei.add(henan);
        AbstractOrganization yanfabu = new Department("研发部", "小李");
        AbstractOrganization xiaoshoubu = new Department("销售部", "小张");
        henan.add(yanfabu);
        henan.add(xiaoshoubu);
        AbstractOrganization shangdong = new BranchCompany("山东分公司", "李四");
        huawei.add(shangdong);
        AbstractOrganization xiaoshoubu2 = new Department("销售部", "小美");
        AbstractOrganization caiwubu = new Department("财务部", "小花");
        shangdong.add(xiaoshoubu2);
        shangdong.add(caiwubu);
        huawei.show();
    }
}

组合模式的适用场景

  1. 构建复杂的树形结构
  2. 希望客户端忽略对象的差异
  3. 处理树形结构

总结

优点

  1. 创建灵活且易于扩展的软件产品,符合开闭原则。组合模式使得添加新类型的组件变得容易,因为这不需要修改现有的类或对象。这种灵活性有助于降低系统的复杂性,提高可维护性和可扩展性。
  2. 简化客户端代码。通过使用组合模式,客户端可以避免处理大量复杂的子系统类。相反,客户端只需要与抽象类或接口进行交互,这有助于简化客户端代码,减少开发人员的工作量。
  3. 易于维护和修改。由于组合模式使得系统结构清晰且易于理解,因此它有助于提高代码的可维护性和可修改性。当需要修改或添加新功能时,可以更容易地定位和替换组件,而不会影响到整个系统的稳定性。

缺点

  1. 增加系统的复杂性和理解难度。使用组合模式需要设计出复杂的类层次结构,并且需要仔细考虑如何将组件组合在一起。这可能会增加系统的复杂性和理解难度,使得开发人员难以理解和维护代码。
  2. 需要正确地识别出系统中两个独立变化的维度。在组合模式中,需要将对象组合成树形结构来表示部分-整体的层次结构。这需要正确地识别出系统中两个独立变化的维度,并且需要将它们组合在一起。如果维度之间的关系不正确,可能会导致系统出现错误或不可维护。
  3. 需要对系统进行递归处理。由于组合模式使用递归结构来构建树形结构,因此需要对系统进行递归处理。这可能会导致处理时间变长,并且在某些情况下可能会出现性能问题。

总之,组合模式适用于构建复杂的树形结构,希望客户端忽略组合对象与单个对象的差异,以及处理树形结构的场景。它能够清晰地定义分层次的复杂对象,简化客户端代码,符合开闭原则。但也存在一些缺点。在应用组合模式时,需要根据具体情况进行权衡,并考虑是否适合使用该模式。

标签:leaderName,String,orgName,public,树形,构建,AbstractOrganization,构件,揭秘
From: https://blog.51cto.com/fanfu1024/8906587

相关文章

  • Jenkins自动化构建Vue项目的实践
    在现代的Web开发中,Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目,使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署(CI/CD)工具,为我们提供了一种便捷的方式来自动化构建Vue.js项目。本文将介绍如何在Jenkins中配置和使用自......
  • 24届秋招薪资大揭秘!寒冬之下任吊打23届!!!
    最近秋招也接近尾声了,各家大厂也陆续开奖了。所以接下来我就结合牛客网和OfferShow的数据,给大家汇总一下,这届秋招各家公司的薪资情况。阅读声明:1、数据来源于牛客网和OfferShow,这些数据都是用户匿名自发上传的,所以不能保证数据100%正确。2、愿意分享数据的同学,通常......
  • 数智驱动未来,卧龙电驱构建端到端敏捷供应链!
    近日,电机板块位列国内第一的卧龙电气驱动集团股份有限公司(以下简称“卧龙电驱”)携手用友BIP采购云打造的数字化采购管理平台平稳落地。基于该平台,卧龙电驱将重塑整个供应链采购体系,以数智化提升企业采购的整体效率,打造卧龙特色的端到端供应链管理体系。卧龙电驱创建于1984年,是全球......
  • 从零开始构建报警中心:part08 数据库链接与验证
    处理了model与schema就可以进行数据的实际操作了。flask应用可以通过flask-sqlachemy进行ORM操作。APP与数据库绑定定义flask应用,对该应用进行配置,绑定数据库链接信息,并初始化DB,相关代码如下app.py这是整个系统的入口,后续将添加登入登出(flask-login),SSO接入,蓝图,以及API接入fromfla......
  • 构建可扩展的网校平台:在线教育系统源码设计与架构最佳实践
    随着科技的不断发展,在线教育系统在教育领域扮演着越来越重要的角色。本文将深入探讨如何构建一个可扩展的网校平台,重点关注在线教育系统的源码设计和架构最佳实践。 一、引言在当前信息时代,教育已经超越了传统的教学方式,转向更加灵活和便捷的在线教育平台。构建一个可扩展的网校平......
  • 三维模型的顶层合并构建中纹理色彩匀色技术方法分析
    三维模型的顶层合并构建中纹理色彩匀色技术方法分析 多块相邻倾斜摄影三维模型的顶层合并构建中,纹理色彩匀色技术是一种常用的方法,可以使不同块之间的纹理色彩更加一致和连贯。本文将对这种技术进行浅谈。在多块相邻倾斜摄影三维模型的顶层合并构建过程中,由于不同块之间的光......
  • 测试开发 | 保护数据隐私的分布式学习方法:构建安全智能未来
    随着信息时代的不断发展,数据隐私的安全性成为科技领域亟待解决的问题之一。分布式学习作为一种保护数据隐私的先进方法,正在成为构建安全智能未来的关键一环。本文将探讨分布式学习方法如何在保护数据隐私的同时推动科技发展。1.数据隐私的挑战随着大数据时代的到来,个人隐私数据的......
  • 苹果推信imessage群发短信:海外拓客大揭秘
    想要拓展海外客户,却苦于没有合适的渠道?别担心,今天就给大家分享一个实用的方法——使用苹果imessage群发短信进行海外拓客。首先,你需要准备好你的苹果设备,并确保你的imessage已经启用。然后,你可以通过添加联系人或者使用现有的客户名单来创建你的短信群发对象。接下来,你可以编写一......
  • 构建健康中国:医保支付购药系统的技术实现
    在数字化时代,医保支付购药系统的技术实现成为医疗保障体系不可或缺的一环。通过整合医疗资源、优化服务流程,这一系统为患者提供了更便捷、高效的医疗服务。本文将深入探讨医保支付购药系统的技术架构与实现方法。1.技术架构概述医保支付购药系统的技术架构主要包括前端界面、后端......
  • 数智相融构建云上安全实现万物互联
    在数字化、智能化的浪潮下,云核算、大数据、物联网等技能正深化改变着咱们的日子和工作方式。数智相融,作为一种全新的技能理念,旨在构建“云网数服”安全系统,完成云上聚合联接、感知、核算、数智才能。本文将从数智相融的界说、技能特色以及应用场景等方面进行探讨,带你深化了解这一......