javascript设计模式学习之十——组合模式
一、组合模式定义及使用场景
组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性。
实现组合模式的关键:
在java等静态语言中,需要单个对象和组合对象都实现同样的抽象接口,对外提供同样的方法,(具有的属性可以不同哈),这可以通过抽象类或者接口来实现。
在javascript中,对象的多态性是与生俱来的,没有编译器去检查对象的类型,因此实现组合模式的要点是保证组合兑现个单个对象用友同样的方法,这通常需要使用“鸭子类型”的思想来对它们进行接口检查。
二、组合模式应用案例—扫描文件夹
//组合模式的学习:扫描文件夹
var Folder=function(name){
this.name=name;
this.files=[];
};
Folder.prototype.add=function(file){
this.files.push(file);
};
Folder.prototype.scan=function(){
console.log('开始扫描文件夹:'+this.name);
for(var i=,len=this.files.length;i<len;i++){
this.files[i].scan();
}
}; var File=function(name){
this.name=name;
};
File.prototype.add=function(){
throw new Error('文件下面不能添加文件!');
};
File.prototype.scan=function(){
console.log('开始扫描文件:'+this.name);
}; //测试
var folder1=new Folder('技术类书籍');
var file1=new File('javascipt技术精粹');
folder1.add(file1); var folder2=new Folder('文学类书籍');
var file2=new File('近距离看美国');
folder2.add(file2); var file3=new File('宠物的秘密'); var folder=new Folder('总文件夹');
folder.add(folder1);
folder.add(folder2);
folder.add(file3);
folder.scan();
使用基于委托的写法来实现组合模式
//使用基于委托的方式重写策略模式
var Folder={
init:function(name){
this.files=[];
this.name=name;
},
add:function(file){
this.files.push(file);
},
scan:function(){
var i,len,curFile;
for(i=,len=this.files.length;i<len;i++){
curFile=this.files[i];
curFile.scan();
}
}
}; var File={
init:function(name){
this.name=name;
},
add:function(){
throw new Error('文件下面不能添加');
},
scan:function(){
console.log(this.name);
}
}; var file=Object.create(File);
file.init('javascript');
var file2=Object.create(File);
file2.init('C++');
var folder1=Object.create(Folder);
folder1.init('folder1');
folder1.add(file);
folder1.add(file2);
var folder2=Object.create(Folder);
folder2.init('folder2');
folder2.add(folder1);
folder2.scan();
javascript设计模式学习之十——组合模式的更多相关文章
- javaScript 设计模式系列之四:组合模式
介绍 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有"整体-部分"关系的层次结构.组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用 ...
- 设计模式学习笔记——Composite 组合模式
用于描述无限层级的复杂对象,类似于描述资源管理器,抽象出每一个层级的共同特点(文件夹和文件,展开事件) 以前描述一个对象,是将整个对象的全部数据都描述清楚,而组合模式通过在对象中定义自己,描述自己的下 ...
- javascript设计模式学习之十二——享元模式
一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...
- javascript设计模式学习之十六——状态模式
一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...
- javascript设计模式学习之十五——装饰者模式
一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用 ...
- javascript设计模式学习之十四——中介者模式
一.中介者模式的定义和应用场景 中介者模式的作用在于解除对象之间的紧耦合关系,增加一个中介者之后,所有对象都通过中介者来通信,而不是互相引用,当一个对象发生变化的时候,仅需要通知中介者即可.从而将网状 ...
- javascript设计模式学习之九——命令模式
一.命令模式使用场景及定义 命令模式常见的使用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的具体操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求的发送者和 ...
- Javascript设计模式学习三(策略模式)
定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换.目的:将算法的使用和算法的实现分离开来.比如: if(input == 'A'){ return 1; } if(input == ...
- 设计模式学习系列6 原型模式(prototype)
原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...
随机推荐
- GC-垃圾回收
代:0代,1代,2代: 所谓第几代,指经历过GC回收的次数. 回收算法: 1.确认需要检查的代. 在分配新对象时, 如果第0代已满,则进行检查:如果第1代已满,则进行检查:第2代同理: 如第0代没有足 ...
- ubuntu安装chrome
1.在Google chrome上面下载Chrome浏览器.选择正确的版本,我电脑是64位的所以选择的是[64 bit .deb (适用于 Debian/Ubuntu)]. google-Chrome ...
- HRBUST 1430 矩阵快速幂
没错就是这道模板题我做了一个小时...我居然在看第一眼就认为是快速幂的情况下强行找了一发瞬时求出的规律 每个阶段有黑白两种 a[i].black=a[i-1].black*3+a[i].white ...
- JavaScript 页面跳转的几种方式 转
第一种: <script language="JavaScript" type="text/javascript"> wi ...
- 使用Nsight查找CE3的渲染bug
工作临时的接的一个小任务,查找ce3引擎修改后在绘制上出的一点bug 在代码的底层调用代码做了一些修改后,场景里的绘制的问题,因为也是刚接触CE3代码,也只能通过Nsight来查找问题了. 首先用 ...
- Linux 每天自动备份mysql数据库的方法
Linux 每天自动备份mysql数据库的方法 作者: 字体:[增加 减小] 类型:转载 linux下为了安全有时候需要自动备份mysql数据库,下面是具体的实现步骤. /usr/bin为my ...
- 【转载】Linux系统与性能监控
原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...
- MongoVUE的使用
配置连接: Ok,连接成功齐活儿~ 下面来试一下,插入一个新的名为Message的Collection : 然后插入个Document
- 【php学习】array_map,array_walk,array_filter的区别
array_map(function($v){return $v+1;}, $array); array_walk($array, function($v, $k){...}); array_filt ...
- global.asax、global.asax.compiled、PrecompiledApp.config三者关系
global.asax用WebDeploy发布后,会在bin下面产生一个global.asax.compiled,同时根目录下产生PrecompiledApp.config. 正常情况下global. ...