例子: Extjs : Ext.CompositeElement ,Standard composite class. Creates a Ext.Element for every element in the collection.
一般面向对象语言的做法 :
按照一般面向对象语言的做法,首先要定义接口,然后composite 和 leaf 直接实现这个借口,leaf用来具体操作,composite则用来遍历,调用相应方法。
遍历
的代码每个接口方法都要重复。
javascript (extjs) 做法:
由于方法可以动态添加,则可以跳过这个限制,直接在叶子节点添加相应的操作,然后再将操作方法统一利用遍历添加到composite类。
例如:
Ext.Element 作为 leaf 有很多操作:setStyle ,setHeight ....
那么
Ext.CompositeElement 作为 composite 也应该支持相应的操作,难道按照传统语言,
将element的各个方法都实现一遍,只为了在每个实现方法中循环调用element的相应方法?!
看看extjs 怎么利用javascript 的动态特性吧。
(function(){
Ext.CompositeElement.createCall = function(proto, fnName){
if(!proto[fnName]){
proto[fnName] = function(){
return this.invoke(fnName, arguments);
};
}
};
for(var fnName in Ext.Element.prototype){
if(typeof Ext.Element.prototype[fnName] == "function"){
Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName);
}
};
})();
只要上述代码运行,则自动将 element 的相应方法设置到了 composite 上面。那么常规的遍历操作呢?
那就要看看invoke方法了。
invoke : function(fn, args){
var els = this.elements;
for(var i = 0, len = els.length; i < len; i++) {
Ext.Element.prototype[fn].apply(els[i], args);
}
return this;
},
可见 extjs composite 模式的实现并没有 仿照传统语言将方法都手动实现在代码里,而是在element确定后,动态的添加到composite里面,并且利用统一的遍历操作来代替传统语言在每个方法的手动遍历调用。invoke 也算用到了 装饰模式,对 element 的各个方法 增强了一下算做自己的方法。(090601)
总结:javascript composite模式 是以leaf 的操作为优先,并其后动态添加到 composite ,不同于传统语言一接口优先,leaf,composite分别实现接口。
PS:组合模式理论基础:
from Pro Javascript Design Patterns
组合模式的两大好处:
1.你可以用同样的方法处理对象的集合与其中特定的对象。composite与leaf实现了同一批操作。对组和对象执行的这些操作将向下传递到所有的leaf。这样一来所有的组成对象都会执行同样的操作。在存在大批对象的情况下,这是一种非常有效的技术。藉此你可以不着痕迹的用一组对象替换一个对象。反之亦然。这有助于弱化各个对象之间的耦合。
2.他可以把一批子对象组织成树形结构,并且使整棵树可以被遍历。所有组合对象都实现了一的代码都不会对其内部实现形成依赖。
在组合对象的层次结构中有两种类型的对象:叶对象和组合对象。这是一种递归定义,但这正是组合对象有用的原因。一个组合对象有一些别的组合对象和叶对象组成。其中只有叶对象不再包含子对象。叶对象是组合对象中最基本的元素,也是各种操作的落脚点。
组合模式的使用范围:
1.存在一批组织成某种层次的对象(具体结构在开发过程中可能无法得知)。
2.希望对这批对象或其中的一部分对象实施一个操作。
组合模式优点:
组合对象擅长于对大批对象就行操作。它专为组织这类对象并把操作从一个层次向下一个层次传递而设计。藉此你可以弱化对象间的耦合并可互转换的使用一些类或实例。使得代码模块化程度更高,也更容易维护。对象之间耦合松散,可随意改变他们之间的位置,促进代码重用,有利于代码重构。在对象层次体系中添加,删除和查找节点都非常容易。
组合模式缺点:
但是如果对象层次过于大,则系统性能会受影响,每个操作实际山都是对整棵对象树的遍历操作调用。系统也越复杂。
相关探讨:
分享到:
相关推荐
本文将详细解析如何利用`Ext.Ajax.request`实现同步请求,并探讨其背后的原理和注意事项。 首先,我们需要理解Ajax的本质,它是Asynchronous JavaScript and XML的缩写,虽然现在XML已不再是主要的数据交换格式,但...
在这个例子中,`Ext.get`和`Ext.fly`都实现了对元素的隐藏或显示操作。然而,`Ext.fly`并不会将`bar`元素的对象持久化在内存中,而`Ext.get`则会缓存`foo`元素的对象,以便于后续的操作。 综上所述,`Ext.get`和`...
这意味着`Ext.ux.form.LovCombo`不仅考虑了功能的实现,还注重了跨浏览器的兼容性,确保在不同的浏览器环境下都能正常工作。 描述中提到的"火狐下取不到值的问题"是前端开发中常见的问题,这可能是由于浏览器对某些...
在阅读《Ext_Core手册.pdf》时,可以深入研究EXTJS的核心概念和API,了解更多关于`Ext.get`和`Ext.fly`的底层实现以及它们在不同场景下的应用策略。同时,理解EXTJS中的`Element`类和DOM操作对于提升EXTJS应用的性能...
从`Ext.data.Store`中获取数据可以通过多种方式实现。最常见的方法是使用`getAt`方法结合`get`方法来获取特定记录中的数据。 ```javascript // 获取第0条记录的name值 var name = store.getAt(0).get('name'); // ...
在Ext.js中,`Ext.Store`是用来管理数据的类,它通常与各种UI组件(如Grid、ComboBox等)关联,用于存储和检索数据。然而,获取`Ext.Store`的方式并不像获取其他Ext组件那样直接,因为Store并不是一个具有可视界面的...
标题"Ext.Ajax.request跨域"指出我们将探讨如何使用ExtJS库中的Ajax模块进行跨域请求。Ext.Ajax.request是ExtJS提供的一种发起Ajax请求的方式,它允许开发者向服务器发送异步HTTP请求。然而,由于浏览器的同源策略...
org.restlet.ext.spring.jar
EXT.form组件是EXT JS库中用于构建表单界面的核心组件集合。这些组件提供了一系列丰富的控件,用于创建具有不同功能的交互式表单。在EXT JS中,表单组件不仅包含基本的输入字段,还支持复杂的输入类型和验证机制。 ...
其中,我们可以看到Ext.Ajax可以实现动态与静态的方式提交到web服务器。从中可以看出,其实Ext框架可以非常方便的与现有网站集成。关于Ext.data.Store类,我们可以看出:该框架提供了客户端缓存的功能--这对于我们...
结合以上代码,你可以实现一个简单的`Ext.Window`并展示图片。在实际应用中,你可能还需要考虑其他因素,如图片加载失败的处理、响应式布局等。 此外,提供的`一个简单的Ext.Window中插入图片.doc`文件可能包含更...
`Ext.ux.SwfUploadPanel.js`是这样一个基于ExtJS和SwfUpload技术的插件,它实现了多文件上传的功能。这篇文章将深入探讨这个插件的工作原理、主要特点以及如何在实际项目中应用。 首先,`ExtJS`(全称为EXT ...
运行Microsoft office时,vbe6ext.olb不能加载
EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档EXT.JS_文档...
在EXTJS这个强大的JavaScript框架中,`Ext.Panel`和`TreePanel`是两个非常重要的组件,它们被广泛用于构建复杂的用户界面。这篇文章将探讨如何在这些组件中动态加载本地页面数据,以提升用户体验并实现灵活的数据...
Ext.js 是一个强大的JavaScript库,专门用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件和数据绑定功能,使得开发者可以构建出具有桌面应用级别的交互式网页应用。本教程和API文档聚焦于Ext.js 3.0版本...
### Ext.window从右下角弹出/隐藏:深入解析与实现 #### 一、概述 在Web应用开发中,为了提升用户体验,开发者经常会利用各种UI框架来实现丰富的交互效果。ExtJS作为一款成熟且功能强大的JavaScript框架,在这方面...
8. **组合框模式**:`Ext.form.TextField`还可以扩展为`Ext.form.ComboBox`,实现下拉选择功能,这在需要用户从预定义选项中选择时非常有用。 在压缩包中的`Ext.form.TextField`文件夹,很可能是包含了一个或者多个...
EXT dojoChina按钮控件示例 Ext.Button.rarEXT dojoChina按钮控件示例 Ext.Button.rarEXT dojoChina按钮控件示例 Ext.Button.rarEXT dojoChina按钮控件示例 Ext.Button.rar