23种设计模式之组合模式

组合模式

1、定义

组合模式:组合多个对象形成树状结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象

2、组合模式结构

  • Component(抽象构件):可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加、删除、获取子构件等
  • Leaf(叶子构件):表示叶子结点对象,没有子节点,它实现了抽象构件中定义的行为。对于访问及管理子构件的方法,可以通过抛出异常、提示错误等方法进行处理
  • Composite(容器构件):表示容器节点对象,包含子节点可以是叶子节点,也可以是容器节点,它提供了一个集合用于存储子节点。实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法

3、示例

Component

java 复制代码
public abstract class Employer {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void add(Employer employer);

    public abstract void delete(Employer employer);

    public List<Employer> employers;

    public void printInfo() {
        System.out.println(name);
    }

    public List<Employer> getEmployers() {
        return this.employers;
    }
}

Leaf

java 复制代码
public class Programmer extends Employer{

    public Programmer(String name) {
        setName(name);
        //程序员, 表示没有下属了
        employers = null;
    }

    @Override
    public void add(Employer employer) {}

    @Override
    public void delete(Employer employer) {}
}
java 复制代码
public class ProjectAssistant extends Employer{

    public ProjectAssistant(String name) {
        setName(name);
        //项目助理, 表示没有下属了
        employers = null;
    }

    @Override
    public void add(Employer employer) {}

    @Override
    public void delete(Employer employer) {}
}

Composite

java 复制代码
public class ProjectManager extends Employer{

    public ProjectManager(String name) {
        setName(name);
        employers = new ArrayList<>();
    }

    @Override
    public void add(Employer employer) {
        employers.add(employer);
    }

    @Override
    public void delete(Employer employer) {
        employers.remove(employer);
    }
}

Client

java 复制代码
public class Client {

    public static void main(String[] args) {
        Employer pm = new ProjectManager("项目经理");
        Employer pa = new ProjectAssistant("项目助理");
        Employer programmer1 = new Programmer("程序员甲");
        Employer programmer2 = new Programmer("程序员乙");
        //为项目经理添加项目助理
        pm.add(pa);
        //为项目经理添加程序员
        pm.add(programmer1);
        pm.add(programmer2);

        List<Employer> ems = pm.getEmployers();
        for (Employer em : ems) {
            System.out.println(em.getName());
        }
    }
}

输出结果

复制代码
项目助理
程序员甲
程序员乙

4、组合模式优缺点

4.1优点
  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,方便对整个层次结构进行控制
  • 客户端可以一致的使用一个组合结构或者其他单个对象,无须对现有类库进行任何修改,符合开闭原则
  • 增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则
  • 为树形结构的面向对象实现提供了一种灵活的解决方案
4.2缺点
  • 在增加新构件时很难对容器中的构件类型进行限制

5、组合模式适用环境

  • 表示对象的部分-整体层次结构
  • 忽略组合对象与单个对象的不同,统一
相关推荐
小雅痞25 分钟前
[Java][Leetcode middle] 55. 跳跃游戏
java·leetcode
com未来31 分钟前
使用 NSSM 安装 Tomcat 11.0.6 为 Windows 服务
java·windows·tomcat
TDengine (老段)36 分钟前
基于 TSBS 标准数据集下 TimescaleDB、InfluxDB 与 TDengine 性能对比测试报告
java·大数据·开发语言·数据库·时序数据库·tdengine·iotdb
养军博客38 分钟前
spring boot3.0自定义校验注解:文章状态校验示例
java·前端·spring boot
lgily-122539 分钟前
常用的设计模式详解
java·后端·python·设计模式
IT成长史1 小时前
deepseek梳理java高级开发工程师微服务面试题
java·微服务
茶本无香1 小时前
Feign+Resilience4j实现微服务熔断机制:原理与实战
java·微服务·feignclient·熔断·resilience4j
遇见火星1 小时前
Ansible模块——从控制节点向目标主机复制文件!
java·服务器·ansible
小码ssim1 小时前
通过POI实现对word基于书签的内容替换、删除、插入
java·word
香饽饽~、1 小时前
函数式方法的实现(JDK8+)
java·服务器