学习《JavaScript设计模式与开发实践》- 组合模式

511 阅读3分钟

组合模式的用途

组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。 除了用来表示树形结 构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使 用具有一致性,下面分别说明。

  • 组合模式提供了一个树状数据的遍历解决方法,很容易表示部分-整体的结构。
  • 组合模式使得用户对待单个数据和组合数据有着相同的操作方式,忽略部分和整体的差异性。

回顾宏命令

在前面的命令模式讲解中,我们定义了一个宏命令类,用于执行一组命令

var MacroCommand = function(){ 
     return { 
             commandsList: [], 
             add: function( command ){ 
                 this.commandsList.push( command ); 
             }, 
             execute: function(){ 
                 for ( var i = 0, command; command = this.commandsList[ i++ ]; ){ 
                 command.execute(); 
             } 
         } 
     } 
};

这里由于每一个命令都具有excute()方法,所以宏命令只是做了一个代理的操作。

实现更强大的宏命令

由于宏命令和单个命令的暴露方法相同,用户不需要知道执行的是什么命令,我们可以借助这个特性来实现更强大的宏命令,即宏命令中我们可以继续添加宏命令,这样下去便会构造出一棵树级指令,启动它的方式也很简单,只需要调用最上级的方法就可以了。

使用场景:遍历文件

假如有这样一个场景,我们将文件存放在文件夹里面,然后文件夹里面也能存放文件。现在如果我们需要对每一个文件杀毒,即遍历每个文件。

这种情况我们就完全可以使用组合模式来做。

我们先定义文件夹类

        var Folder = function(name){
            this.name = name;
            this.fileLsit = [];
        }
        Folder.prototype.add = function(file){
            this.fileLsit.push(file);
        }   
        Folder.prototype.excute = function(){
            console.log("遍历文件夹"+this.name+":");
            this.fileLsit.map(item => item.excute());
        }

然后是文件类

        var File = function(name){
            this.name = name;
        }
        File.prototype.add = function(){
            throw new Error("File can't add File");
        } 
        File.prototype.excute = function(){
            console.log("遍历文件",this.name);
        }

之后我们创建一个树状文件结构

        var folder_C = new Folder("C盘");
        var file_JS = new File("JS从入门到精通");
        var file_Node = new File("nodeJS");
        
        folder_C.add(file_JS);
        folder_C.add(file_Node);

        var folder_study = new Folder("学习文件夹h");
        var file_TS = new File("TS从入门到精通");
        var file_C = new File("C语言学习");
        folder_study.add(file_TS);
        folder_study.add(file_C);
        
        folder_C.add(folder_study);
        folder_C.excute();

打印结果

遍历文件夹C盘
遍历文件 JS从入门到精通
遍历文件 nodeJS
遍历文件夹学习文件夹
遍历文件 TS从入门到精通
遍历文件 C语言学习

优点

组合模式最大的优点在于可以一致地对待组合对象和基本对象。客户不需要知道 当前处理的是宏命令还是普通命令,只要它是一个命令,并且有 execute 方法,这个命令就可以 被添加到树中。

总结

本文简单介绍了组合模式和他的一个实践,只要需求有以下特点,你都可以考虑组合模式:

  • 你想表示对象的部分-整体层次结构时;
  • 你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象(方法)

感谢看到这里,不妨留个赞再走呀~~~