组合模式
**// 组合模式在对象间形成树形结构
// 组合模式中基本对象和组合对象被一致对待
// 无须关心对象有多少层 调用时只需要在根部进行调用**
结合了命令模式和组合模式的具体实现:
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()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。