Javascript设计模式-14-组合模式

来源:互联网 发布:校园网络拓扑图 编辑:程序博客网 时间:2024/06/15 19:18

Javascript设计模式-14-组合模式

简介

在程序设计中华,有一些和 ‘事物是由相似的子事物构成’类似的思想,组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成

用途

组合模式将对象组合成树形结构,以表示部分整体的层次,通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性

请求在树中传递的过程

请求会沿着树形结构从请求其实节点向下传递,直到树的尽头

    // 目录类    var Folder = function (name) {        this.name = name;        this.parent = null;        this.files = [];    }    // 目录下添加文件或者文件夹    Folder.prototype.add = function (file) {        file.parent = this; // 指定父节点        this.files.push(file);    }    // 扫描    Folder.prototype.scan = function () {        var parentName = (this.parent && this.parent.name) || '';        console.log('扫描文件夹:', parentName + '-' + this.name);        // 将扫描命令向下传递        var files = this.files;        for (var i = 0; i <= files.length - 1; i++) {            files[i].scan();        }    }    // 删除当前子节点    Folder.prototype.remove = function () {        // 当前节点不是子节点不需要操作        if (!this.parent) {            return;        }        // 从父节点中删除当前子节点        for (var files = this.parent.files, l = files.length - 1; l >= 0; l--) {            var file = files[l];            if (file === this) {                files.splice(l, 1);            }        }    }    // 文件类    var File = function (name) {        this.name = name;        this.parent = null;    }    // 误操作警示    File.prototype.add = function () {        throw new Error('文件下边不能添加!');    }    // 扫描    File.prototype.scan = function () {        var parentName = (this.parent && this.parent.name) || '';        console.log('扫描文件:', parentName + '-' + this.name);    }    // 删除当前子节点    File.prototype.remove = function () {        // 当前节点不是子节点不需要操作        if (!this.parent) {            return;        }        // 从父节点中删除当前子节点        for (var files = this.parent.files, l = files.length - 1; l >= 0; l--) {            var file = files[l];            if (file === this) {                files.splice(l, 1);            }        }    }    // 测试    var folder = new Folder('学习资料');    var folder1 = new Folder('javascript');    var folder2 = new Folder('jquery');    var file1 = new File('JavaScript 设计模式与开发实践');     var file2 = new File('精通 jQuery');     var file3 = new File('重构与模式');    folder1.add(file1);    folder2.add(file2);    folder.add(folder1);    folder.add(folder2);    folder.add(file3);    // 扫描    folder.scan();    console.log('==== ====== ======= ======');    // 新加文件    var folder3 = new Folder('Node');    var file4 = new File('深入浅出 Node.js');    folder3.add(file4);    folder1.add(folder3);    folder.scan();    console.log('==== ====== ======= ======');    // 删除文件    file1.remove();    folder.scan();

何时使用组合模式

  • 表示对象的部分-整体层次结构
  • 客户希望同一对待树中的所有对象,可以把相同的操作应用在组合对象和单个对象上,忽略他们的差别,用一致的方式处理

文章列表

  1. javascript设计模式 – 设计原则
  2. JavaScript设计模式–高阶函数
  3. Javascript 设计模式 - 01 - 原型模式
  4. Javascript 设计模式 - 02 - 单例模式
  5. Javascript 设计模式 - 03 - 建造者模式
  6. Javascript 设计模式 - 04 - 工厂模式
  7. Javascript 设计模式 - 05 - 外观模式
  8. Javascript 设计模式 - 06 - 代理模式
  9. Javascript 设计模式 - 07 - 观察者模式(发布订阅模式)
  10. Javascript 设计模式 - 08 - 策略模式
  11. Javascript 设计模式 - 09 - 命令模式
  12. Javascript 设计模式 - 10 - 迭代器模式
  13. Javascript 设计模式 - 11 - 职责链模式
  14. Javascript 设计模式 - 12 - 适配器模式
  15. Javascript 设计模式 - 13 - 模板方法
  16. Javascript 设计模式 - 14 - 组合模式
  17. Javascript 设计模式 - 15 - 享元模式
  18. Javascript 设计模式 - 16 - 中介者模式
  19. Javascript 设计模式 - 17 - 装饰者模式
  20. Javascript 设计模式 - 18 - 状态模式
原创粉丝点击