首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >学习《JavaScript设计模式与开发实践》- 组合模式

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

作者头像
Jou
发布2022-08-10 20:44:37
发布2022-08-10 20:44:37
4040
举报
文章被收录于专栏:前端技术归纳前端技术归纳

组合模式的用途

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

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

回顾宏命令

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

代码语言:javascript
复制
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()方法,所以宏命令只是做了一个代理的操作。

实现更强大的宏命令

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

使用场景:遍历文件

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

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

我们先定义文件夹类

代码语言:javascript
复制
        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());
        }

然后是文件类

代码语言:javascript
复制
        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);
        }

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

代码语言:javascript
复制
        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();

打印结果

代码语言:javascript
复制
遍历文件夹C盘
遍历文件 JS从入门到精通
遍历文件 nodeJS
遍历文件夹学习文件夹
遍历文件 TS从入门到精通
遍历文件 C语言学习

优点

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

总结

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

  • 你想表示对象的部分-整体层次结构时;
  • 你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象(方法)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组合模式的用途
  • 回顾宏命令
  • 实现更强大的宏命令
  • 使用场景:遍历文件
  • 优点
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档