Composite - 组合模式

Composite-组合模式

Why

无论是“部门”还是“员工”,它们都应该能执行相同的操作,例如:

  • 打印信息

  • 计算总工资

  • 统计人数

但是:

  • 部门下面可以有子节点;

  • 员工就不能再包含别的节点。

问题就来了:我们希望客户端不必区分“是部门还是员工”,都能统一调用。

这时就需要——组合模式。

组合模式让你操作单个对象与组合对象时不再做区分,

树形结构 + 统一接口 + 递归调用 = 万物皆节点。

主要角色

208eff1eabd624b5ab3e78a25cfbfd4426f4bdef

bed538e8c2dcaacd7fb7aabcdaa129ab6f7eaa57

核心 以统一接口的代价,换取结构操作的统一性。

In my

word

让抽象组件有叶子节点和容器节点的并集属性,

然后让他们两个实现抽象组件, 并且只重写需要的方法

(这里好像违背了接口隔离,员工继承了不需要的add类,根据你的代码解决方法好像是抛出异常),然后就用多态来实现不区分节点还是容器的操作了

    1
    2
    <li><p>✅ 统一性 &gt; 接口纯洁性</p></li>
    <li><p>✅ 可递归结构 &gt; 严格职责分离</p></li>

组合模式的核心思想是
——让单个对象(叶子)和组合对象(容器)在结构上具有一致性

也就是说,通过在抽象组件中同时定义“叶子行为”和“组合行为”,

容器节点重写组合相关方法(如 add()、remove()),

叶子节点只实现自身行为(不需要的可抛异常)。

这样,客户端就能用同一套接口去操作树形结构中的任意节点,而无需区分它是叶子还是组合。

两种模式

e165890f7cb09ecbca7841ecc9a1e57c6baffcc1

优点 7847bc7e433edf5cd71eb536d59951dc06e302d6