组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性(稳定)。
示意图
示例代码
typescript
interface Component {
operation(): void;
}
class Leaf implements Component {
public operation() {
console.log('Leaf');
}
}
class Composite implements Component {
private children: Array<Component> = [];
public add(child: Component) {
this.children.push(child);
}
public remove(child: Component) {
const index = this.children.indexOf(child);
if (index !== -1) {
this.children.splice(index, 1);
}
}
public operation() {
for (const child of this.children) {
child.operation();
}
}
}
// usage
const root = new Composite();
const leaf = new Leaf();
root.add(leaf);
root.operation();
interface Component {
operation(): void;
}
class Leaf implements Component {
public operation() {
console.log('Leaf');
}
}
class Composite implements Component {
private children: Array<Component> = [];
public add(child: Component) {
this.children.push(child);
}
public remove(child: Component) {
const index = this.children.indexOf(child);
if (index !== -1) {
this.children.splice(index, 1);
}
}
public operation() {
for (const child of this.children) {
child.operation();
}
}
}
// usage
const root = new Composite();
const leaf = new Leaf();
root.add(leaf);
root.operation();
优缺点
优点
- 可将一对多的关系转化为一对一的关系,使得客户端代码可以一致地处理对象和对象的组合。
- 可以让父对象中的子对象反向追溯,如果父对象有频繁的遍历操作,可使用缓存来进行优化。
缺点
- 设计变得更加复杂。
- 不容易限制组合中的组件类型。
使用场景
- 在图形编辑器中实现一系列的几何图形的绘制功能。