组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成。

有点类似树形结构的意思,这里举一个包含命令模式的例子

 var list=function(){   //创建接口对象的函数
return {
arr:[], //执行列表 用来存储需要执行的对象
add:function(obj){ //往执行列表里添加对象
this.arr.push(obj);
},
execute:function(){ //遍历执行列表,每个对象执行规定好的接口方法
for(var i=0,l=this.arr.length;i<l;i++){
this.arr[i].execute();
}
}
}
}; var menubar={ //一系列对象,每个对象都有一个相同的接口,便于同时调用
execute:function(){
console.log("刷新menubar")
}
} var headbar={
execute:function(){
console.log("刷新headbar")
}
} var footbar={
execute:function(){
console.log("刷新footbar")
}
} var move={
execute:function(){
console.log("加入动画")
}
} var picA={
execute:function(){
console.log("移除picA")
}
} var picB={
execute:function(){
console.log("移除picB")
}
} var refresh=list(); //负责刷新的接口对象
refresh.add( menubar ); //添加需要刷新的对象
refresh.add( headbar );
refresh.add( footbar ); var remove=list(); //负责移除的接口对象
remove.add( picA ); //需要移除的对象
remove.add( picB ); var start=list(); //负责所有事情的接口对象
start.add( refresh ); //添加负责刷新的组合对象
start.add( move ); //添加负责动画的对象
start.add( remove ); //添加负责移除的组合对象 start.execute(); //执行这个组合对象 /****执行结果**** 刷新menubar
刷新headbar
刷新footbar
加入动画
移除picA
移除picB
*/

感觉上有点像俄罗斯套娃,首先定义了一个接口对象,大家都是这个接口对象,只不过一层套一层,不断调用。

执行过程其实就是深度优先搜索

一些值得注意的地方

组合模式不是父子关系,而是更类似于一种委托关系。
适用场景:只有用一致的方式对待列表中的每个叶对象的时候,才适合使用组合模式。

总结

组合模式可以让我们使用树形方式创建对象的结构,我们可以把相同的操作应用在组合对象和单个对象上。

《javascript设计模式与开发实践》阅读笔记(10)—— 组合模式的更多相关文章

  1. javascript设计模式与开发实践阅读笔记(6)——代理模式

    代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对 ...

  2. javascript设计模式与开发实践阅读笔记(4)——单例模式

    定义 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 具体来说,就是保证有些对象有且只有一个,比如线程池.全局缓存.浏览器中的window 对象等.在js中单例模式用途很广,比如登录 ...

  3. javascript设计模式与开发实践阅读笔记(8)——观察者模式

    发布-订阅模式,也叫观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 在JavaScript开发中,我们一般用事件模型来替代传统的观察者模式. ...

  4. javascript设计模式与开发实践阅读笔记(7)——迭代器模式

    迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

  5. javascript设计模式与开发实践阅读笔记(5)——策略模式

    策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率 ...

  6. javascript设计模式与开发实践阅读笔记(9)——命令模式

    命令模式:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 说法很复 ...

  7. javascript设计模式与开发实践阅读笔记(11)—— 模板方法模式

    模板方法模式: 由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序.子类通过继承这个抽象类,也继 ...

  8. JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)

    说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...

  9. JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)

    上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...

  10. 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式

    第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...

随机推荐

  1. [HNOI2008]水平可见直线

    按斜率排序后画个图,用单调栈维护这个半平面交 # include <bits/stdc++.h> # define IL inline # define RG register # def ...

  2. 使用NPOI导出Excel引发异常(IsReadOnly = “book.IsReadOnly”引发了类型“System.NotImplementedException”的异常)

    前言: 本人调式npoi导入.导出试用成功后,引入到项目中,导入完美运行,但是导出怎么样都看不到现在的页面,而且浏览器和后台都没有报任务错误,让人好事纳闷,后来去调式,发现在除了一个IsReadOnl ...

  3. react实战第一步--搭建项目

    使用 create-react-app 快速构建 React 开发环境 1.cnpm install -g create-react-app 2.create-react-app react2(rea ...

  4. Django 2.0 学习(02):Django视图和URL(上)

    接上篇博文,接下来我们以具体代码例子来说明Django的基本流程. 创建项目 使用Win+R,输入cmd进图windows命令行模式: 再你想要存放项目工作的磁盘,输入下面命令: django-adm ...

  5. opencv 学习入门篇

    unbuntu 安装:http://blog.csdn.net/cocoaqin/article/details/78163171 windows 安装:https://jingyan.baidu.c ...

  6. WordPress菜单“显示选项”无法显示的解决办法

    比较新版本的WordPress会出现点击“外观”——“菜单”右上角的“显示选项”无法打开的问题,而老版本的就没有这个问题,后台的其他页面中的这个 功能都可以正常使用,看来问题是因为中文版WordPre ...

  7. 安装Oracle11g的依赖包

    binutils-2.17.50.0.6 compat-libstdc++-33-3.2.3 elfutils-libelf-0.125 elfutils-libelf-devel-0.125 elf ...

  8. IPFS网络是如何运行的(p2p网络)

    IPFS是一个p2p网络,先来看看BitTorrent的p2p网络是如何工作的? 想要bt下载一个文件,首先你需要一个种子文件torrent,种子文件包含至少一个 Tracker(一台服务器地址)信息 ...

  9. NGUI_Texture

    六.UITexture:在屏幕上显示一张图片,和Sprite类似,但是UITexture会单独消耗一个DrawCall去渲染, 会单独加载进内存,会增加内存的开销. 1.使用UITexture时要遵循 ...

  10. elasticsearch------java操作之QueryBuilders构建搜索Query

    版权声明:本文为非原创文章,出处:http://blog.csdn.net/xiaohulunb/article/details/37877435. elasticsearch 分布式搜索系列专栏:h ...