JS学习十九天----组合模式

组合模式

前言

我今天又看了一下我自己写的博客,排版咋能这么丑?还能再丑一点吗?!我看了看我同学的排版,那叫一个漂亮啊,我想起来了一句诗:排版写得好,老公回家早!这几天我在修改我的排版,如果大家有什么意见,欢迎来稿!谢谢.

正文

组合模式:把多个对象组成树状结构来表示局部与整体,使得用户可以一样的对待单个对象和对象的组合.

1.可以以相同的方法处理对象的集合与其中的特定子对象.组合对象与组合该对象的对象可实现同一批操作.对组合(Composite)对象执行的操作过程将向下传递到所有的组成对象,使得所有组成对象都会执行同样的操作.

2.可以将对象组织成树状结构,并且使整棵树可被遍历.所有组合对象都实现一个用来获取其子对象的方法,借助该方法可以隐藏实现的细节,阻止子对象,使子对象内部实现不形成依赖.

(说概念不是本屌的风格)

想想你每次去理发店理发的场景吧,貌似每次理发师都要忽悠你办卡!!我就被忽悠了好几次!!搞得我每次都不想听他们逼逼!!烦的想让他要死不活的!理发师无法和你说办了卡打折啊,而且他们还有分店,加盟店,总店,一张卡都可以用,这和组合模式的定义相似,组合模式定义:将对象组合成树形结构以表示”部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.

就用办卡这个案例说吧,一张卡可以在总店,分店,加盟店里使用,这个属性结构的店面层次关系就明确了.

那么,总店消费和分店消费就是一样的道理,总店和分店对会员卡的使用也具有一致性(打的折是一样的).

别忘了,你理一次发,给你10个积分,100个积分就能免费理一次,,那么你在总店理发,不管是总店,分店,加盟店,对于你的会员卡都知道你又增加了10个积分,在总店增加了10个积分,所有点都知道了你增加了10个积分,积分通用知道吗?我想你应该明白我的意思了,我说的有点啰嗦,只是希望你明白.

JS中的组合模式案例

组合模式又叫部分-整体模式,它将所有对象组合成树形结构。使得用户只需要操作最上层的接口,就可以对所有成员做相同的操作。

一个再好不过的例子就是jquery对象,大家都知道1个jquery对象其实是一组对象集合。

在这样一个HTML页面中:

<div>
<span></span>
   	<span></span>
</div>
 

我们想取消所有节点上绑定的事件,需要这样写:

var allNodes = document.getElementsByTagName("*");
var len = allNodes.length;
while( len-- ){
  	allNodes.unbind("*");
}
 

再来个具体点的例子, 还是dev.qplus.com这个网站的即时验证表单。

注意到下面”修改资料”的按钮了吗?如果有人以一个field的验证没有通过,修改资料的按钮都将是灰色不可点的状态.这意味着我们重新填写表单内容后,都得去校验每个field,保证他们全部OK.

这样的代码不难实现

if ( nameField.validata() && idCard.validata() && email.validata() && phone.validata() ){
  	alert ( "验证OK" );
}

似乎我使用一个外观模式也能解决问题,但是问题是,我们并不能保证表单里field的数量,也许明天产品经理就让你删掉一个或者两个,或者增加一两个,那么这样的维护方法显然不合理.

更好的实现是有一个form.validata函数, 它负责把真正的validata操作分发给每个组合对象.

form.validata函数里面会依次遍历所有需要校验的field. 若有一个field校验未通过, form.validata都会返回false. 伪代码如下:

form.validata = function(){
  forEach( fields, function( index, field ){
    if ( field.validata() === false  ){
       return false;
    }
  })
  return true;
}
 

简单的说,组合模式是将一批子对象组织为树形结构,一条顶层的命令在操作数中所有的对象.提高了代码的模块化程度,对于动态的HTML界面具有很强的适用性.

小小的总结一下

是不是还是对组合模式一知半解,不明所以呢?没关系,其实呢,关于设计模式呢,代码啥的无所谓,不会就不会吧,也别记住实现代码,没啥用处,主要是记住理论,理解了就行

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 07:29:50

JS学习十九天----组合模式的相关文章

学习日记之组合模式和Effective C++

组合模式(Composite):将对象组合成树形结构以表示"部分-整体"的组合结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式和安全方式 (1),透明方式:在 Component 中声明所有用来管理子对象的方法,其中包括 Add. Remove 等.这样实现 Component 接口的所有子类都具备了 Add.Remove 方法.这样做的好处是子类对外界来说没有区别,他们具有完全一致的行为接口.但也有问题,有些子类不具备某些功能,所以实现那些接口没有意义. (2)

【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)

树导航效果图: 组合模式的描述: 将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 我们把部分用Leaf表示, 把整体用Composite表示.组合模式是有一定规律的,在实现树导航的情况下,Composite需要包含一个以上Leaf,也可以包含一个以上Leaf和一个以Composite,为什么说要包含一个以上的,如果Composite不包含任何子child的话那么它就是Leaf,Leaf表示是最后一层结节. 树形导航代码片段:

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

[JS 设计模式 ]用组合模式来实现树形导航--代码结构思路分析(一) 根据上一节中的HTML代码结构我们通过JS来渲染HTML代码,我们先提供一下JS的代码片段,这代码代码不是一个完整的代码是经过简化的.通过JS代码来分析如何组装HTML的 Composite类型的代码: function TreeComposite(id, name, total, level, last) { var root = document.createDocumentFragment(); var panel =

JS学习十五天----设计模式开篇

JS设计模式开篇 前言 作为小小程序员一枚,除了敲个hello,world以后啥都不会了,最近发现设计模式这个东西挺好,想搞一下,声明,本屌不是一个看见什么好,什么新潮就追什么的人,本屌还是一个比较实际的人,一般不会说什么好要什么,学设计模式完全是个人的爱好,看一看做是无聊打发时间的消遣吧. 什么是设计模式呢?既然是个模式,就说明可以套用这个模式,套用你知道是什么意思吧?一本万利明白吧?差不多就是这个意思,等你熟练掌握了所有的设计模式之后,你就可上九天揽月,可下五洋捉鳖.手握日月摘星辰,世间无我

Java设计模式菜鸟系列(十二)组合模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-整体模式,将对象组合成树形结构来表示"部分-整体"层次结构.组合模式在处理树形结构的问题时比较方便. 一.uml建模: 二.代码实现 /** * 示例:组合模式有时也称"整合-部分"模式 * * 组合模式在处理树形结构的问题时比较方便 * * 节点 */ class TreeNode { /

设计模式学习笔记之组合模式

组合模式 允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 使用组合结构,我们能把相同的操作应用在组合和个别对象上.换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别. 说明: 1.组合模式使添加或者删除子节点变得容易: 场景: 1.想要标识对象的部分-整体结构: 2.想要客户端忽略组合对象和个体对象的差异,客户端将统一使用组合结构中的所有对象: /** * 为组合中所有对象定义一个接口,不管是组合还是节点 * */ pu

Ext JS学习第九天 Ext基础之 扩展原生的javascript对象

此文来记录学习笔记: •Ext对于原生的javascript对象进行了一系列的扩展,我们把他们掌握好,更能深刻的体会Ext的架构,从而对我们的web开发更好的服务, 源码位置,我们可以从开发包的这个位置找到这几个扩展的js源码: •extjs-4.1.1\src\core\src\lang\ •ExtJS扩展原生Javascript –Ext.Object –Ext.Number –Ext.String –Ext.Array –Ext.Function –Ext.Date –Ext.Error

JS学习十六天----单例模式

单例模式 说实话,今天本来不想写博客的,但是思前想后,与其看看片,不如打打字(炮),还是写一点吧,不多写个最简单的的,别看简单,但是很常用啊! 今天发现了一个好东西叫做基维百科,我在里面看到了关于单例模式的一点小小的介绍,因为本屌不是很喜欢抄写概念啥的,但是百科里面说的还不错,给你们抄过来: 在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为.比如在整个系统的配置文件中,配置数据有一个单例对象集进行统一读取和修改,其他对象

前端学习(33)~js学习(十):函数

关于函数的核心内容: 函数有哪几种定义和调用方式 this:函数内部的 this 指向.如何改变 this 的指向. 函数的严格模式 高阶函数:函数作为参数传递.函数作为返回值传递 闭包:闭包的作用 递归:递归的两个条件 深拷贝和浅拷贝的区别 函数的介绍 函数:就是将一些功能或语句进行封装,在需要的时候,通过调用的形式,执行这些语句. 函数也是一个对象 使用typeof检查一个函数对象时,会返回function 函数的作用: 将大量重复的语句抽取出来,写在函数里,以后需要这些语句的时候,可以直接