设计模式-结构型模式-组合模式

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

"当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。"

复制代码
首先,我们定义一个Component接口,这是所有组件的基类:

// 组件接口
public interface Component {
    void display(int depth);
}

接下来,我们定义Leaf类,表示员工(叶子节点):
// 员工类(叶子节点)
public class Leaf implements Component {
    private String name;

    public Leaf(String name) {
        this.name = name;
    }

    @Override
    public void display(int depth) {
        // 打印缩进和叶子节点信息
        for (int i = 0; i < depth; i++) {
            System.out.print("--");
        }
        System.out.println("Leaf: " + name);
    }
}

然后,我们定义Composite类,表示部门(复合节点):
import java.util.ArrayList;
import java.util.List;

// 部门类(复合节点)
public class Composite implements Component {
    private String name;
    private List<Component> children = new ArrayList<>();

    public Composite(String name) {
        this.name = name;
    }

    // 添加子组件
    public void add(Component component) {
        children.add(component);
    }

    // 移除子组件
    public void remove(Component component) {
        children.remove(component);
    }

    @Override
    public void display(int depth) {
        // 打印缩进和复合节点信息
        for (int i = 0; i < depth; i++) {
            System.out.print("--");
        }
        System.out.println("Composite: " + name);

        // 递归显示子组件
        for (Component child : children) {
            child.display(depth + 1);
        }
    }
}

最后,我们编写一个Client类来测试我们的组合模式:
public class Client {
    public static void main(String[] args) {
        // 创建组织结构
        Composite root = new Composite("公司");

        // 创建部门
        Composite departmentIT = new Composite("IT部");
        Composite departmentHR = new Composite("HR部");

        // 创建员工
        Leaf employeeAlice = new Leaf("Alice");
        Leaf employeeBob = new Leaf("Bob");

        // 将员工加入部门
        departmentIT.add(employeeAlice);
        departmentIT.add(employeeBob);

        // 将部门加入公司
        root.add(departmentIT);
        root.add(departmentHR);

        // 显示整个组织结构
        root.display(0);
    }
}
当运行Client类的main方法时,会输出以下结构:
Composite: 公司
--Composite: IT部
----Leaf: Alice
----Leaf: Bob
--Composite: HR部
相关推荐
Zane19943 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫4 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19944 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19945 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..5 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1506 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)6 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki7 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅667 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa7 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio