1。什么是组合模式,又称“部分-整体”模式,将对象组合成树状结构,表示“部分-整体”的层次结构。通过对象的多态性,用户可以以一致的方式使用单个对象和组合对象,如下代码所示:}};varopenPcCommand={execute:function(){console.log('启动电脑');}};varopenQQCommand={execute:function(){console.log('登录QQ');}};varMacroCommand=function(){return{commandsList:[],add:function(command){this.commandsList.push(command);},execute:function(){for(vari=0,command;command=this.commandsList[i++];){command.execute();}}}};varmacroCommand=MacroCommand();macroCommand.add(closeDoorCommand);macroCommand.add(openPcCommand);macroCommand.add(openQQCommand);macroCommand.execute();以上是命令模式的一个应用,macroCommand命令称为复合对象,其中包含三个叶子对象:closeDoorCommand、openPcCommand、openQQCommand。macroCommand的execute方法并不进行真正的操作,而是遍历其包含的叶子对象,将真正的执行请求委托给这些叶子对象。2.应用场景组合模式是基于树结构的,所以组合模式的使用场景就是树结构出现的地方:“命令分发:”你只需要请求树的最顶层对象就可以统一整个树的操作.组合方式的树节点增删改查非常方便,符合开闭原则;“统一处理”:统一对待树中的所有对象,忽略组合对象与叶子对象的区别。如果上面的例子稍微复杂一点,当我们点击按钮时,一系列的操作(开空调,开电视,开音响)其中开电视和开声音是一个组合对象组,代码如下:);},execute:function(){for(vari=0,command;command=this.commandsList[i++];){command.execute();}}}};varopenAcCommend={execute:function(){console.log('打开空调');}}//同时打开电视和音响varopenTvCommand={execute:function(){console.log('打开电视');}}varopenSoundCommand={execute:function(){console.log('Turnonthesound');}}varmacroCommand1=MacroCommand()macroCommand1.add(openTvCommand)macroCommand1.add(openSoundCommand)//关上门,打开电脑,登录QQ命令varcloseDoorCommand={execute:function(){console.log('关闭door');}};varopenPcCommand={execute:function(){console.log('打开电脑');}};varopenQQCommand={execute:function(){console.log('登录QQ');}};varmacroCommand2=MacroCommand();macroCommand2.add(closeDoorCommand);macroCommand2.add(openPcCommand);macroCommand2.add(openQQCommand);//所有命令组合成一个超级命令设置命令varsetCommand=(function(command){document.getElementById('button').onclick=function(){command.execute()}})(macroCommand)组合模式的透明性使得请求客户端不用担心复合对象和树中叶子对象的区别,但它们有本质的区别组合对象可以有叶子节点,而叶子对象下没有子节点,所以我们可能会出现一些误操作,比如试图给叶子对象添加子节点。解决方法是在叶子对象中添加add方法,在调用该方法时抛出异常,及时提醒用户,如下:varMacroCommand=function(){return{commandsList:[],add:function(command){this.commandsList.push(command);},execute:function(){for(vari=0,command;command=this.commandsList[i++];){command.execute();}}}};varopenAcCommend={execute:function(){console.log('开空调');},add:function(){thrownewError('叶子对象不能添加子节点')}}3.总结组合模式经常创建对象以树的形式,如下图所示:特点如下:表示“部分-整体”的层级结构,生成“叶型”结构一致且可操作,叶的对外接口对象保持一致(操作与数据结构一致),自上而下的请求流向,从树对象传递到叶对象调用顶层对象,以及它会遍历它下面的叶对象来执行。参考资料https://www.runoob.com/design-pattern/composite-pattern.htmlhttps://segmentfault.com/a/1190000019773556https://juejin.cn/post/6995851145490989070
