专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »XML教程 » asp.netajax:AJAX模型 »正文

asp.netajax:AJAX模型

来源: 发布时间:星期五, 2008年9月26日 浏览:114次 评论:0

当回顾MVC模式的各个方面时,一种好的方式是从比较形象的视图开始,随后逐渐过渡到背后比较抽象的模型概念。但是,当我们开始给AJAX组件应用MVC时,从模型开始再过渡到视图更有意义。并且以这种顺序实现通常能够更加容易以测试驱动方式(test-driven approach)来编写我们的代码,在具体编码之前我们会先写测试,然后编写保证测试都能通过的代码,通过这种方式可以逐层构建应用。逻辑上,开发AJAX应用时我们需要做的第一件事是访问数据。实际上,从服务器读取数据只是AJAX组件实际使用AJAX的一部分,大多数所谓的AJAX实际上只是DHTML。我们从一个独立JavaScript模型开始,它与服务器没有联系,仅仅实现了CRUD功能。任何模型的基本功能都要求能够在客户端维护一组数据记录列表,类似于MySQL的ResultSet和ADO的RecordSet。这是我们可以创建的最简单的模型类型,它几乎不包含任何域信息(domain information)。记录集可以以任何数据格式进行保存例如XML或者普通的JavaScript对象(POJSO,Plain Old JavaScript Object)。然而,在简单模型中也存在一些公共的功能,这些功能与存储格式无关。为了让基本的MVC模型适合观察者模式(Observer pattern),我们需要考虑一些基础方面的问题。最重要的是,基本模型的每个重要的CRUD操作都需要有相应的事件。下面是DataModel类,它定义了一个简单的模型。

entAJAX.DataModel = function() {

this.onRowsInserted = new entAJAX.SubjectHelper();

this.onRowsDeleted = new entAJAX.SubjectHelper();

this.onRowsUpdated = new entAJAX.SubjectHelper();

}

entAJAX.DataModel.prototype.insert = function(items, index) { }

entAJAX.DataModel.prototype.read = function() { }

entAJAX.DataModel.prototype.update = function(index, values) {

}

entAJAX.DataModel.prototype.remove = function(index) { }

这里,我们根据第2章讨论过的定义类的指导原则创建了一个称为DataModel的新JavaScript类,这个类代表基本模型,它在构造函数里实例化基本的事件并且为4种固有的数据操作——CRUD定义了桩方法。实际上,这个DataModel类应该是一个抽象类,因为缺少CRUD方法内的具体定义,但是因为在JavaScript里并没有一种简单的方法来表明抽象类,所以暂时还必须这么采用这种方式来实现。无论如何,DataModel类提供了一个很好的基础,我们可以根据它来为各种数据存储种类创建更加具体的模型。

请注意,这里的事件(onRowsDelete等)是作为DataModel类的属性创建的,它们的类型是SubjectHelper。SubjectHelper类是观察者模式的一个重要部分,图3-4对这个模式进行了描述。

观察者模式

图3-4 观察者模式的类图

在这个观察者模式的具体实现中,我们没有像往常一样使用ConcreteSubject实现ISubject接口,而是使用一个SubjectHelper类来实现ISubject接口。通过这种方式实现观察者模式,我们可以将多个SubjectHelper类(或者继承于SubjectHelper的更加具体的类)与一个单独的Subject关联,如图3-5所示,这里的Subject是DataModel类。

DataModel观察者模式

图3-5 观察者模式精化设计

使用SubjectHelper类有多个优点。不仅可以帮助从观察者模式的实现中分离出域逻辑,还允许我们为更加细粒度的目标(Subject)创建具体的辅助类。我们的DataModel域对象存在一些可能发生的操作,例如数据插入、删除和更新。对于每个操作而言,都可能存在不同的观察者对这些事件中的一部分事件感兴趣。通过观察者模式里的SubjectHelper,某个观察者可以只订阅他想被通知的特定目标,而不是让所有观察者都订阅DataModel对象本身,否则会导致不管他们是否对特定的事件感兴趣,当任一事件发生改变时他们都会被通知到。我们也可以想象,如果所有的观察者都订阅域对象本身而不是他们所关注的具体事件,这样在运行期就会产生很大的开销。UML模型里的ISubject接口在JavaScript中的编码如下所示:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: