首页 > 其他分享 >组合模式(Composite Pattern)

组合模式(Composite Pattern)

时间:2023-05-17 22:34:38浏览次数:37  
标签:salary 组合 Composite Pattern dept add Employee new

组合模式

一、概述

  组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。

二、介绍

  将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

它主要包含如下几个角色:

  • 抽象构件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。
  • 叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。
  • 容器构件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。

优点:

  1. 高层模块调用简单。
  2. 节点自由增加。

缺点:

  1. 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:

  1. 部分、整体场景,如树形菜单,文件、文件夹的管理。

三、代码实现

1、抽象构件 抽象统一接口

/**
 * 组合模式  Employee 类
 *
 * @author zt1994 2021/4/3 15:57
 */
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;

    public Employee(String name, String dept, int sal) {
        this.name = name;
        this.dept = dept;
        this.salary = sal;
        subordinates = new ArrayList<Employee>();
    }

    public void add(Employee e) {
        subordinates.add(e);
    }

    public void remove(Employee e) {
        subordinates.remove(e);
    }

    public List<Employee> getSubordinates() {
        return subordinates;
    }

    @Override
    public String toString() {
        return ("Employee :[ Name : " + name
                + ", dept : " + dept + ", salary :"
                + salary + " ]");
    }
}

2、测试

/**
 * 组合模式测试类
 *
 * @author zt1994 2021/4/3 16:00
 */
public class CompositePatternTest {

    public static void main(String[] args) {
        Employee CEO = new Employee("John", "CEO", 30000);

        Employee headSales = new Employee("Robert", "Head Sales", 20000);

        Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);

        Employee clerk1 = new Employee("Laura", "Marketing", 10000);
        Employee clerk2 = new Employee("Bob", "Marketing", 10000);

        Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
        Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);

        CEO.add(headSales);
        CEO.add(headMarketing);

        headSales.add(salesExecutive1);
        headSales.add(salesExecutive2);

        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        //打印该组织的所有员工
        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}

3、测试结果

Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]

标签:salary,组合,Composite,Pattern,dept,add,Employee,new
From: https://www.cnblogs.com/zt19994/p/17410534.html

相关文章

  • 策略模式(Strategy Pattern)
    策略模式一、介绍  在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护......
  • ShardingSphere + Pagehelper 组合sql查询中包含 DISTINCT GROUP BY 等关键字和聚合函
    Pagehelper中配置说明params:为了支持startPage(Objectparams)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;r......
  • GDI-ExtSelectClipRgn将指定区域与当前剪辑区域组合在一起
     HRGNhrgn1;HRGNhrgn;HRGNhrgn2;HRGNhrgn3;HDChdc;HBRUSHhbr;voidCGdiPlusDlg::OnBnClickedButton10(){hdc=::GetDC(m_hWnd);hrgn1=CreateRectRgn(10,10,200,200);//创建矩形区域intn=SelectClipRgn(hdc,hrgn1);//选择剪切区域......
  • 2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心
    路漫漫其修远兮,吾将上下而求索。 2023年5月的 墨天轮中国数据库流行度排行 火热出炉,本月共有262个数据库参与排名。本月排行榜前十变动较大,可以用一句话概括为:openGauss立足创新夺探花;华为云GaussDB云上之争成赢家;其余数据库自强不息居原位。从2023年5月起,排行榜月度解读文......
  • 设计模式-组合模式
    [url]http://zz563143188.iteye.com/blog/1847029[/url]组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图:[img]http://dl.iteye.com/upload/attachment/0083/1205/09cab656-5ff9-380e-9df1-326339ac3509.jpg[/img]直接来看代码......
  • 基于人工蜂群(ABC)算法和粒子群优化算法的组合求解路径优化问题附Matlab代码
    基于人工蜂群(ABC)算法和粒子群优化算法的组合求解路径优化问题附Matlab代码针对经典人工蜂群算法在机器人路径规划中易于陷入局部极值,且寻优过程收敛速度较慢等问题,提出了一种基于粒子群改进人工蜂群算法.通过设计变异算子来增大极值在陷入局部最优时的跳出概率,提高机器人路径......
  • 第八章 组合逻辑电路
          数字电路用于对数字量信息进行传送、运算、变换、比较、存储等操作。按逻辑功能的特点不同,可以把数字电路分成两类:组合逻辑电路和时序逻辑电路,本章仅介绍组合电路。       组合逻辑电路(CombinationalLogicCircuit)的功能特点是:电路在任意时刻的输出状态,仅......
  • GDI-CombineRgn将两个区域组合为一个新区域
     HRGNhrgn1=CreateRectRgn(10,10,100,100);//创建矩形区域HRGNhrgn2=CreateEllipticRgn(150,150,250,250);//创建椭圆区域HRGNhrgn=CreateRectRgn(0,0,0,0);intn1=::CombineRgn(hrgn,hrgn1,hrgn2,RGN_OR);//将两个区域组合为......
  • 【转载】基于物料限制逆向实现产品组合的最优规划
    原文:https://www.logclub.com/articleInfo/NTEwNzg= 在之前的案例中,我们分享的主要是如何用算法模型来提高决策效率与质量,并以此节约运营成本,整体上是如何把已有的事情做的更快更好。这次给大家分享的是,过去比较少见,但是当前越发频繁的场景,就是关键物料短缺下如何实现资源效率......
  • MATLAB代码:考虑电动汽车有序充放电的机组组合和最优潮流 关键
    MATLAB代码:考虑电动汽车有序充放电的机组组合和最优潮流关键词:电动汽车MILP最优潮流参考文档:《Abi-layeroptimizationbasedtemporalandspatialschedulingforlarge-scaleelectricvehicles》仿真平台:MATLABYALMIPGUROBI主要内容:机组组合采用原文相同的线性化方法最......