【设计模式In Java】七、组合模式

组合模式

定义

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

组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构。

场景

现在需要开发一个会议系统,当有部门预约会议时,需要给部门下的所有成员发送提醒邮件,但值得注意的是:部门下级可能还是部门,也可能是部门成员;以部门为单位预约会议时,要保证每个部门的成员和子部门的成员都要收到邮件提醒。

UML类图

在这里插入图片描述

代码

composite

示例:

public class TestComposite {

    @Test
    public void test() {

        Department it = new Department("IT");
        Department rd = new Department("Research and Development");
        Department om = new Department("Operation and Maintenance");
        Department ar = new Department("Architecture");

        it.addAll(Arrays.asList(
                new Employee("Ashe", "ashe@company.com"),
                new Employee("Bob", "bob@company.com"),
                new Employee("Candy", "candy@company.com"),
                new Employee("David", "david@company.com")
        ));

        rd.addAll(Arrays.asList(
                new Employee("Eric", "eric@company.com"),
                new Employee("Fizz", "fizz@company.com"),
                new Employee("Galio", "galio@company.com"),
                new Employee("Harris", "harris@company.com")
        ));

        om.addAll(Arrays.asList(
                new Employee("Iran", "iran@company.com"),
                new Employee("John", "john@company.com"),
                new Employee("Kat", "kat@company.com"),
                new Employee("Lucian", "lucian@company.com")
        ));

        ar.addAll(Arrays.asList(
                new Employee("Mondor", "mondor@company.com"),
                new Employee("Nox", "nox@company.com"),
                new Employee("Olaf", "olaf@company.com"),
                new Employee("Puff", "puff@company.com")
        ));

        it.addAll(Arrays.asList(rd, om, ar));

        it.sendMail();

    }
    /*
    Send mail to department IT -------------------
    Send mail to Ashe(ashe@company.com)...
    Send mail to Bob(bob@company.com)...
    Send mail to Candy(candy@company.com)...
    Send mail to David(david@company.com)...

    Send mail to department Research and Development -------------------
    Send mail to Eric(eric@company.com)...
    Send mail to Fizz(fizz@company.com)...
    Send mail to Galio(galio@company.com)...
    Send mail to Harris(harris@company.com)...

    Send mail to department Operation and Maintenance -------------------
    Send mail to Iran(iran@company.com)...
    Send mail to John(john@company.com)...
    Send mail to Kat(kat@company.com)...
    Send mail to Lucian(lucian@company.com)...

    Send mail to department Architecture -------------------
    Send mail to Mondor(mondor@company.com)...
    Send mail to Nox(nox@company.com)...
    Send mail to Olaf(olaf@company.com)...
    Send mail to Puff(puff@company.com)...
     */
}

总结

组合模式虽然让“容器”和“元件”分离开来,但是对它们的操作却是非常简单——客户端可以一致地使用一个容器或其中单个元件,不必关心处理的是单个元件还是整个容器,简化了客户端代码。同时需要添加一种容器或元件的时候,不需要修改原有代码,遵循开闭原则。

从定义就可以看出:组合模式适用于可以用树形结构表示数据结构的业务场景,比如UI组件、层级菜单、目录结构等,特别是那些容器和元件可能会不断扩展的系统,如果想忽略容器和元件的差异,达到统一处理的目的,组合模式是一个很好的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值