组合模式(二)
来源:互联网 发布:js 轨迹回放 编辑:程序博客网 时间:2024/05/18 01:39
组合模式的使用场景:
1、存在一批组织成某种层次体系的对象
2、希望对这批对象或其中的一部分对象实施一个操作。
组合模式的特点:
1、组合模式中只有两种类型对象:组合对象、叶子对象
2、这两种类型都实现同一批接口
3、一般我们会在组合对象中调用其方法并隐式调用"下级对象"的方法(这里我们一般采用递归的形式去做)
/** * 组合模式应用的场景和特点: 场景: 1、存在一批组织成某种层次体系的对象那个 2、希望对这批对象或其中的一个部分对象实施一个操作 应用特点: 1、组合模式中只有两种类型对象:组合对象、叶子对象 2、这两种类型都实现同一批接口 3、一般我们会在组合对象中调用其方法并瘾式调用‘下级对象’的方法(这里我们一般采用递归的形势去做) * 场景模拟: * -> 公司 * -> 北京分公司 * -> 财务部门 * -> 张1 * -> 张2 * -> 张3 * -> 销售部门 * -> 张4 * -> 张5 * -> 张6 -> 上海分公司 * -> 财务部门 * -> 张7 * -> 张8 * -> 张9 * -> 销售部门 * -> 张10 * -> 张11 * -> 张12 * *实际的任务具体是落实到人上去实施的 也就是说只有人才具有具体的方法实现 * */ //这两个类型必须实现同一个接口 //添加方法和取得方法 var CompositeInterface = new Fan.Interface('CompositeInterface',['addChild','getChild']); //努力工作和努力睡觉 var LeafInterface = new Fan.Interface('LeafInterface',['hardworking','sleeping']); //组合对象 var Composite = function(name){ this.name = name; this.type = 'Composite'; //说明对象的类型,方便判断他是组合对象还是叶子对象 this.children = []; //承装子类的数组 }; Composite.prototype = { constructor : Composite, addChild : function(child){ this.children.push(child); return this; }, getChild : function(name){ //接受叶子对象类型数组 var elements = []; //判断对象是否为Leaf类型的 var pushLeaf = function(item){ if(item.type === 'Composite'){ item.children.each(arguments.callee); }else if(item.type === 'Leaf'){ elements.push(item); } }; if(name && this.name !== name){ //根据name传值,指定name下的所有类型leaf对象去执行操作 this.children.each(function(item){ //如果传入的name是二级子节点名称 if(this.name === name && item.type === 'Composite'){ item.children.each(pushLeaf); } //如果传递的name是三级节点或者是N级 if(this.name !== name && item.type === 'Composite'){ item.children.each(arguments.callee); } //如果传递的name是叶子节点 if(this.name === name && item.type === 'Leaf'){ elements.push(item); } }) }else{ //不传name,让整个公司所有类型为Leaf的对象去执行操作 //org.hardworking();没有传值,就遍历公司所有部门 this.children.each(pushLeaf); } return elements; }, hardworking : function(name){ //得到所有的Leaf类型的对象数组 var leafObject = this.getChild(name); for(var i=0; i<leafObject.length; i++){ leafObject[i].hardworking(); } }, sleeping : function(name){ var leafObject = this.getChild(name); for(var i=0; i<leafObject.length; i++){ leafObject[i].sleeping(); } } } //叶子对象 var Leaf = function(name){ this.name = name; this.type = 'Leaf'; }; Leaf.prototype = { constructor : Leaf, //叶子节点方法无法再调用下一级 addChild : function(child){ throw new Error('不能被使用'); }, getChild : function(name){ if(this.name == name){ return this; } return name; }, hardworking : function(name){ console.log(this.name + '努力工作...'); }, sleeping : function(name){ console.log(this.name + '努力睡觉...'); } } //测试数据 var p1 = new Leaf('张1'); var p2 = new Leaf('张2'); var p3 = new Leaf('张3'); var p4 = new Leaf('张4'); var p5 = new Leaf('张5'); var p6 = new Leaf('张6'); var p7 = new Leaf('张7'); var p8 = new Leaf('张8'); var p9 = new Leaf('张9'); var p10 = new Leaf('张10'); var p11 = new Leaf('张11'); var p12 = new Leaf('张12'); var dept1 = new Composite('北京开发部门'); dept1.addChild(p1).addChild(p2).addChild(p3); var dept2 = new Composite('北京销售部门'); dept2.addChild(p4).addChild(p5).addChild(p6); var dept3 = new Composite('上海开发部门'); dept3.addChild(p7).addChild(p8).addChild(p9); var dept4 = new Composite('上海销售部门'); dept4.addChild(p10).addChild(p11).addChild(p12); var org1 = new Composite('北京分公司'); org1.addChild(dept1).addChild(dept2); var org2 = new Composite('上海分公司'); org2.addChild(dept3).addChild(dept4); var org = new Composite('深圳总部'); org.addChild(org1).addChild(org2); org.hardworking('张7');
0 0
- 组合模式(二)
- 设计模式(二十一)---组合模式
- 组合模式二
- 设计模式(二):结构行模式之组合模式
- 二十、组合模式Composite(结构型模式)
- 设计模式——迭代器与组合模式(二)
- 组合模式实现方式二
- 树形结构的处理——组合模式(二):组合模式概述
- HTML5 Canvas进阶(二):模式,组合,阴影,状态,变形
- 树形结构的处理——组合模式(二)
- 树形结构的处理——组合模式(二)
- 树形结构的处理——组合模式(二)
- 设计模式系列(二): 组合模式
- 设计模式(二十七)------23种设计模式(19):组合模式
- 组合查询(二)
- 组合(二)
- 组合模式(Composite)
- 组合模式(Composite)
- 【HDU】-4707-Pet(并查集,好)
- Linux每天一点修改文件时间或创建新文件
- BFC是什么?
- 暑假讲座总结(一)
- git 本地分支与远程分支关联的一种方法
- 组合模式(二)
- COGS 1844 最大数
- java解析xml文件的四种方式
- POJ2506——Tiling
- hdoj 5326 Work【并查集】
- hdu 2120 (Ice_cream's world I)
- Java Basics Part 15/20 - Date & Time
- collection
- SPI、I2C、UART三种串行总线的原理、区别及应用