组合模式 📖
定义
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
文件目录,DOM 文档树,公司部门组织架构,国家省市县等
实现
js
class Folder {
constructor(folder) {
this.folder = folder
this.lists = []
}
add(resource) {
this.lists.push(resource)
}
scan() {
console.log('开始扫描文件夹: ', this.folder)
for (let i = 0, folder; (folder = this.lists[i++]); ) {
folder.scan()
}
}
}
class File {
constructor(file) {
this.file = file
}
add() {
throw Error('文件下不能添加其它文件夹或文件')
}
scan() {
console.log('开始扫描文件: ', this.file)
}
}
const folder = new Folder('根文件夹')
const folder1 = new Folder('JS')
const folder2 = new Folder('life')
const file1 = new File('深入React技术栈.pdf')
const file2 = new File('JavaScript权威指南.pdf')
const file3 = new File('小王子.pdf')
folder1.add(file1)
folder1.add(file2)
folder2.add(file3)
folder.add(folder1)
folder.add(folder2)
folder.scan()
注意
组合模式不是父子关系
组合模式的树型结构是一种 HAS-A(聚合)的关系,而不是 IS-A 。树叶对象能够合作的关键,是它们对外保持统一接口,而不是叶对象继承树对象的属性方法,两者之间不是父子关系。对叶对象操作的一致性
叶对象除了与树对象接口一致外,操作也必须保持一致性。双向映射关系
一片叶子只能生在一颗树上。调用顶层对象时,每个叶对象只能接收一次请求,一个叶对象不能从属多个树对象。