Skip to content

组合模式

组合模式概述

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示"部分-整体"的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。

核心思想

  • 将对象组织成树形结构
  • 通过统一接口操作单个对象和组合对象
  • 递归处理树形结构中的所有节点

代码示例

typescript
//组件接口,定义所有组件<复合对象和叶节点的统一接口>
abstract class Component {
  constructor(public name: string) {}
  abstract excute(): void;
}

//复合对象类
class Composite implements Component {
  private list: Component[] = [];
  constructor(public name: string) {}

  //提供一个接口将叶子节点添加到符合对象的列表中
  public add(instance: Component) {
    this.list.push(instance);
  }

  public show() {
    console.log(this.list);
  }

  public excute(): void {
    if (!this.list.length) return;
    console.log(this.name);
    for (let i = 0, len = this.list.length; i < len; i++) {
      const component = this.list[i];
      component!.excute();
    }
  }
}

//叶子节点类
class Leaf implements Component {
  constructor(public name: string) {}
  public excute(): void {
    console.log(`${this.name}收到了`);
  }
}

//定义一个公司,是一个复合节点
const companyInstance = new Composite("公司");
//定义一个老板
const boss = new Leaf("boss");
//将老板加入公司
companyInstance.add(boss);

//创建一个售前部门
const sales = new Composite("售前部门");
//创建售前部门的员工
const zhangsan = new Leaf("张三");
const lisi = new Leaf("李四");
sales.add(zhangsan);
sales.add(lisi);
companyInstance.add(sales);

//创建一个售后部门
const afterSalesService = new Composite("售后部门");
//创建售后部门的员工
const wangwu = new Leaf("王五");
const laoliu = new Leaf("老六");

afterSalesService.add(wangwu);
afterSalesService.add(laoliu);
companyInstance.add(afterSalesService);

//调用统一的接口执行相同的操作
companyInstance.excute();