zhangdizhangdi

组合模式 📖

定义

组合模式(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()
执行结果
开始扫描文件夹:  根文件夹
开始扫描文件夹:  JS
开始扫描文件:  深入React技术栈.pdf
开始扫描文件:  JavaScript权威指南.pdf
开始扫描文件夹:  life
开始扫描文件:  小王子.pdf

注意

  • 组合模式不是父子关系
    组合模式的树型结构是一种 HAS-A(聚合)的关系,而不是 IS-A 。树叶对象能够合作的关键,是它们对外保持统一接口,而不是叶对象继承树对象的属性方法,两者之间不是父子关系。

  • 对叶对象操作的一致性
    叶对象除了与树对象接口一致外,操作也必须保持一致性。

  • 双向映射关系
    一片叶子只能生在一颗树上。调用顶层对象时,每个叶对象只能接收一次请求,一个叶对象不能从属多个树对象。

参考