一天一个设计模式---组合模式

基本概念

组合模式是一种结构型设计模式,它允许客户端统一对待单个对象和对象的组合。组合模式通过将对象组织成树形结构,使得客户端可以一致地使用单个对象和组合对象。

主要角色:

  1. Component(组件): 定义组合中的对象接口,可以是抽象类或接口,声明了用于管理子组件的方法。
  2. Leaf(叶子): 表示组合中的叶子节点对象,实现了Component接口。叶子节点没有子节点。
  3. Composite(复合): 表示组合中的具有子节点的复合对象,实现了Component接口。复合对象可以包含叶子节点和其他复合对象,形成递归结构。

优点

  • 统一接口: 客户端通过统一的接口处理单个对象和组合对象,不需要区分它们的具体类型。
  • 灵活性: 客户端可以以相同的方式处理单个对象和组合对象,从而使得系统更加灵活。
  • 可扩展性: 可以方便地添加新的组件,无需修改客户端代码。

结构

在这里插入图片描述

示例代码

Component 定义了组件的接口,Leaf 表示叶子节点,Composite 表示复合节点。客户端可以通过统一的 operation 方法处理单个对象和组合对象。

// Component
class Component {
  constructor(name) {
    this.name = name;
  }

  operation() {
    throw new Error('Operation not supported');
  }
}

// Leaf
class Leaf extends Component {
  operation() {
    console.log(`Leaf ${this.name} operation`);
  }
}

// Composite
class Composite extends Component {
  constructor(name) {
    super(name);
    this.children = [];
  }

  add(child) {
    this.children.push(child);
  }

  remove(child) {
    const index = this.children.indexOf(child);
    if (index !== -1) {
      this.children.splice(index, 1);
    }
  }

  operation() {
    console.log(`Composite ${this.name} operation`);
    this.children.forEach(child => child.operation());
  }
}

// Usage
const leaf1 = new Leaf('1');
const leaf2 = new Leaf('2');

const composite = new Composite('Composite');
composite.add(leaf1);
composite.add(leaf2);

const leaf3 = new Leaf('3');
const leaf4 = new Leaf('4');

const subComposite = new Composite('SubComposite');
subComposite.add(leaf3);
subComposite.add(leaf4);

composite.add(subComposite);

composite.operation();

相关推荐

  1. 一个设计模式---责任链模式

    2024-01-17 13:30:04       34 阅读
  2. 设计模式详解(十)——组合模式

    2024-01-17 13:30:04       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-17 13:30:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-17 13:30:04       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-17 13:30:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-17 13:30:04       20 阅读

热门阅读

  1. route和router的区别

    2024-01-17 13:30:04       33 阅读
  2. C++中的符号->

    2024-01-17 13:30:04       25 阅读
  3. messages,CentOS 7不收集日志或不存在 /var/log/messages

    2024-01-17 13:30:04       28 阅读
  4. 【软件设计模式之单例模式】

    2024-01-17 13:30:04       34 阅读
  5. 蓝桥杯 第三场 小白入门赛

    2024-01-17 13:30:04       39 阅读
  6. Leetcode 474 一和零

    2024-01-17 13:30:04       31 阅读
  7. 自己的第一篇博客——回顾和展望

    2024-01-17 13:30:04       35 阅读
  8. conda create SafetyError

    2024-01-17 13:30:04       36 阅读