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、组合模式适用环境

  • 表示对象的部分-整体层次结构
  • 忽略组合对象与单个对象的不同,统一
相关推荐
萧瑟余晖40 分钟前
JDK 26 新特性详解
java·开发语言
马优晨1 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说4 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19945 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充5 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充5 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了5 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品5 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘5 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记6 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端