1

组合模式

**// 组合模式在对象间形成树形结构
// 组合模式中基本对象和组合对象被一致对待
// 无须关心对象有多少层 调用时只需要在根部进行调用**
结合了命令模式和组合模式的具体实现:

    const MacroCommand = function () {
      return {
        lists: [],
        add: function (task) {
          this.lists.push(task)
        },
        excute: function () { //组合对象调用这里的excute
          for (let i = 0; i < this.lists.length; i++) {
            this.lists[i].excute()
          }
        }
      }
    }
    const command1 = MacroCommand() //基本对象
    command1.add({
      excute: () => console.log('煮咖啡') //基本对象调用这里的excute
    })
    const command2 = MacroCommand()
    command2.add({
      excute: () => console.log('打开电视')
    })
    command2.add({
      excute: () => console.log('打开音响')
    })
    const command3 = MacroCommand()
    command3.add({
      excute: () => console.log('打开空调')
    })
    command3.add({
      excute: () => console.log('打开电脑')
    })
    console.log(command1.lists) //所对应的内存地址不一样
    console.log(command2.lists) //所以lists 保存的不一样
    console.log(command3.lists)

    const macroCommand = MacroCommand()
    macroCommand.add(command2) //分次放入不同的参数
    macroCommand.add(command3) // 函数的引用不变,对应的就是同 
                                 //一个堆
     macroCommand.add(command1)
     //最后把command1、2、3都放入数组中 调用excute,触发每一个数 
      //组中的excute方法
    macroCommand.excute()

demo2 —— 扫描文件夹
扫描文件夹时, 文件夹下面可以为另一个文件夹也可以为文件, 我们希望统一对待这些文件夹和文件, 这种情形适合使用组合模式。

   const Folder = function(folder){
    this.folder = folder
    this.lists = []
   }
   Folder.prototype.add = function(resource){
     this.lists.push(resource)
   }
   Folder.prototype.scan = function(){
     console.log('开始扫描文件夹',this.folder)
     for(let i =0,folder; folder = this.lists[i++];){
       folder.scan()
     }
   }
   const File = function(file){
     this.file = file
   }
   File.prototype.add = function(){
     throw Error('文件下不能添加其他文件夹或文件')
   }
   File.prototype.scan = function(){
     console.log('开始扫描文件',this.file)
   }
   const folder = new Folder('根文件加')
   const folder1 = new Folder('JS')
   const folder2 = new Folder('life')
   const file1 = new File('js技术栈')
   const file2 = new File('权威')
   const file3 = new File('小王子')
   folder1.add(file1)
   folder1.add(file2)
   folder2.add(file3)
   folder.add(folder1)
   folder.add(folder2)
   folder.scan()

HappyCodingTop
526 声望847 粉丝

Talk is cheap, show the code!!