秋雨
首页
  • HTML
  • CSS
  • JavaScript
设计模式
webpack
  • 前端常识
  • ES
  • React
  • Redux
  • ReactRouter
  • 事件循环
  • 浏览器渲染流程
  • Vue项目性能优化
  • Vue
  • App
Github
首页
  • HTML
  • CSS
  • JavaScript
设计模式
webpack
  • 前端常识
  • ES
  • React
  • Redux
  • ReactRouter
  • 事件循环
  • 浏览器渲染流程
  • Vue项目性能优化
  • Vue
  • App
Github
  • 构造器模式
  • 原型链模式
  • 工厂模式
  • 抽象工厂模式
  • 建造者模式
  • 单例模式
  • 装饰器模式
  • 适配器模式
  • 适配器模式
  • 代理模式
  • 观察者模式
  • 发布订阅模式
  • 模块模式
  • 桥接模式
  • 组合模式
  • 命令模式
  • 命令模式
  • 迭代器模式
  • 职责链模式

简介

组合模式在对象间形成树形结构 组合模式中基本对象和组合对象被一致对待 无须关心对象有多少层,调用时只需在根部进行调用。

它在我们树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

示例

const Folder = function (folder) {
  this.folder = folder;
  this.list = []; //保存子文件夹或者文件
};

Folder.prototype.add = function (res) {
  this.list.push(res);
};

Folder.prototype.scan = function (res) {
  console.log("扫描文件夹", this.folder);
  for (let i = 0; i < this.list.length; i++) {
    this.list[i].scan();
  }
};

const File = function (file) {
  this.file = file;
};

File.prototype.scan = function () {
  console.log("开始扫描文件", this.file);
};
//根
let rootFolder = new Folder("root");
// 子文件夹
let htmlFolder = new Folder("html");
let cssFolder = new Folder("css");
let jsFolder = new Folder("js");

//文件
let html1 = new File("html1");
let html2 = new File("html2");

let css1 = new File("css1");
let css2 = new File("css2");

let es5 = new File("es5");
let es6 = new File("es6");

rootFolder.add(htmlFolder);
rootFolder.add(cssFolder);
rootFolder.add(jsFolder);

htmlFolder.add(html1);
htmlFolder.add(html2);
cssFolder.add(css1);
cssFolder.add(css2);
jsFolder.add(es5);
jsFolder.add(es6);

rootFolder.scan();

示例

const Folder = function (folder) {
  this.folder = folder;
  this.list = []; //保存子文件夹或者文件
};

Folder.prototype.add = function (res) {
  this.list.push(res);
};

Folder.prototype.scan = function (res) {
  console.log("扫描文件夹", this.folder);
  if (this.folder === "root") {
  } else {
    var oul = document.createElement("ul");
    var oli = document.createElement("li");
    oli.innerHTML = this.folder;
    var ochildUl = document.createElement("ul");
    oli.appendChild(ochildUl);
    oul.appendChild(oli);
    root.appendChild(oul);
  }
  for (let i = 0; i < this.list.length; i++) {
    this.list[i].scan(ochildUl);
  }
};

const File = function (file) {
  this.file = file;
};

File.prototype.scan = function (ochildUl) {
  console.log("开始扫描文件", this.file);
  var oli = document.createElement("li");
  oli.innerHTML = this.file;
  ochildUl.appendChild(oli);
};
//根
let rootFolder = new Folder("root");
// 子文件夹
let htmlFolder = new Folder("用户管理");
let cssFolder = new Folder("权限管理");
let jsFolder = new Folder("新闻管理");

//文件
let html1 = new File("添加用户");
let html2 = new File("编辑用户");

let css1 = new File("添加权限");
let css2 = new File("编辑权限");

let es5 = new File("添加新闻");
let es6 = new File("编辑新闻");

rootFolder.add(htmlFolder);
rootFolder.add(cssFolder);
rootFolder.add(jsFolder);

htmlFolder.add(html1);
htmlFolder.add(html2);
cssFolder.add(css1);
cssFolder.add(css2);
jsFolder.add(es5);
jsFolder.add(es6);

rootFolder.scan();
最后更新:
贡献者: Mrlishizhen
Prev
桥接模式
Next
命令模式