跳到主要内容

组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一对待单个对象和组合对象。

组合模式的主要角色包括:

  1. 组件(Component): 定义了叶子节点和组合节点的共同接口,使得客户端可以一致地处理单个对象和组合对象。

  2. 叶子(Leaf): 表示组合中的叶子节点,叶子节点没有子节点。

  3. 组合(Composite): 表示组合中的组合节点,组合节点包含子节点,可以是叶子节点,也可以是其他组合节点。

以下是一个简单的 JavaScript 示例,演示了组合模式:

// 组件接口
class Component {
constructor(name) {
this.name = name;
}

operation() {
throw new Error('operation method must be implemented by subclasses.');
}
}

// 叶子节点
class Leaf extends Component {
operation() {
console.log(`Leaf ${this.name} is performing operation.`);
}
}

// 组合节点
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} is performing operation.`);
for (const child of this.children) {
child.operation();
}
}
}

// 客户端代码
const leaf1 = new Leaf('1');
const leaf2 = new Leaf('2');
const leaf3 = new Leaf('3');

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

const composite2 = new Composite('B');
composite2.add(leaf3);

const root = new Composite('Root');
root.add(composite1);
root.add(composite2);

root.operation();
// Output:
// Composite Root is performing operation.
// Composite A is performing operation.
// Leaf 1 is performing operation.
// Leaf 2 is performing operation.
// Composite B is performing operation.
// Leaf 3 is performing operation.

在这个例子中,Component 是组件接口,定义了叶子节点和组合节点的共同操作。Leaf 是叶子节点,表示组合中的单个对象。Composite 是组合节点,它包含了子节点,可以是叶子节点,也可以是其他组合节点。客户端代码创建了一个包含多个组合和叶子节点的树形结构,并调用了根节点的 operation 方法。

组合模式的优点包括:

  • 统一接口: 客户端可以一致地对待单个对象和组合对象,因为它们都实现了相同的接口。
  • 灵活性: 可以通过组合形成复杂的层次结构,使得客户端可以动态地组合和调整对象。
  • 简化客户端代码: 客户端无需关心处理的是单个对象还是组合对象,简化了客户端代码。

组合模式常用于处理树形结构,例如文件系统、图形界面的布局等。