组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。
在组合模式中,有两种关键角色:
3.** 合成(Composite)**: 实现了组件接口的组合对象,它具有叶子和其他组合对象作为子节点,可以递归地组合成更复杂的树形结构。
假设我们要构建一个文件系统的树形结构:
// 组件接口class FileSystemComponent {constructor(name) {this.name = name;}// 公共接口方法display() {}}// 叶子对象class File extends FileSystemComponent {display() {console.log(`File: ${this.name}`);}}// 组合对象class Directory extends FileSystemComponent {constructor(name) {super(name);this.children = [];}// 添加子节点add(component) {this.children.push(component);}// 移除子节点remove(component) {const index = this.children.indexOf(component);if (index !== -1) {this.children.splice(index, 1);}}display() {console.log(`Directory: ${this.name}`);this.children.forEach(child => {child.display();});}}// 客户端代码const file1 = new File("document.txt");const file2 = new File("image.jpg");const directory1 = new Directory("Documents");directory1.add(file1);directory1.add(file2);const file3 = new File("video.mp4");const directory2 = new Directory("Media");directory2.add(file3);const rootDirectory = new Directory("Root");rootDirectory.add(directory1);rootDirectory.add(directory2);// 显示整个文件系统结构rootDirectory.display();
在这个例子中,FileSystemComponent
是组件接口,File
是叶子对象,Directory
是组合对象。Directory
可以包含叶子对象(File)和其他组合对象(Directory),从而构建了一个树形结构。客户端代码可以通过调用 display
方法遍历整个文件系统结构,而不需要关心是文件还是目录,实现了对整体和部分的一致性访问。