[设计模式] TableModule表格模块 设计模式
Table Module用一个实例处理针对数据库表格或视图的所有业务逻辑。表格模块TableModule将领域逻辑组织在一个类中,这个类对应数据库中的一个表格,此类包含不同的例程用于处理数据。领域模型与表格模块最大的区别是:如果你有多个订单,一个领域模型会对应一个订单。而表格模块是用一个对象处理所有的订单。即前者DomainModle是每记录对应一个对象,而TableModule是用集合的手段处理记录的,每表格一个对象。
其强大之处是:允许打包数据和行为的同时表现出关系数据库的强大。在表面上表格模块看起来像一个常规的对象,关键之处是它没有任何标识该对象的符号信息(无主键)。所以在访问该类实例的某个字段时必须传入标识性的参数,通常会是数据库表中的主键属性。常规对象的标识是通过其引用,或数组索引或集合的健(如哈希key)。比如要获取某个顾客的地址可能用这样的方法:CustomerTableModule.getAddress(customerID),表格模块经常有一个面向数据库中表格的后台数据结构,其数据常来自sql语句调用,调用的结果会封装在模拟sql表的结果及中RecordSet。表格模块提供直接作用于数据的基于方法的接口。将用于表的行为组化给我们许多封装的好处,使行为更贴近其工作的数据。有时我们会需要来自多个表格模型的行为,我们也会看到多个表格模型操作在同一个结果集的情形。
表格模型最常见的例子是对于数据库中的每一个表格使用一个表格模型,然而也可用查询(sql)语句或是视图来对应表格模型,在VisualStudio中数据源添加或创建时就有这两种情形,后一种情形感觉稍高级,适用复杂应用。
表格模型可以是可实例化的,也可是一些静态方法的集合。可实例化表格模型的好处是允许用存在的记录集(与结果集同意义)初始化。或许是查询的结果,可使用实例去操纵纪录集的行,实例亦使继承成为可能,可以在基础契约之上添加额外的行为(契约可理解为类承诺实现的公共方法——关于契约,可参考 design by contract xxx 简称dbc)。
表格模块也可能包含查询的工厂方法,可替换的设计是用TableDataGateWay表格数据网关,但缺点是设计时引入了额外的网关和机制(表格数据网关是数据层用来沟通关系型数据库和面向对象编程环境的OR影射层)。优点是使用一个表格模型在不同的数据源上。因而可针对不同的数据源使用不同的表格数据网关。
当使用表格数据网关时,应用程序先用表格数据网关装配数据到记录集(RecordSet)中。之后用该记录集作为参数来构造表格模块。当需要的行为来自多个表格模块式,可使用同一个结果集创建这些表格模块。之后表格模块可在记录集上执行业务逻辑并传递修改过的记录集到表示层显示和编辑(widgets是表格数据敏感的)窗体小组件(widgets)不能区分结果集数据的操作是来自表格模型的还是来自关系数据库。在从GUI修改之后数据集会送给表格模块进行验证之后才存入数据库中,此形式的优点是可通过在内存中创建记录集来测试表格模块,而不必非得与数据库相连。“table”的含义建议我们用一个表格模块来对应数据库中的一个表格
但不一定非得如此,用一个表格模块来对应常规的查询或视图也是很常见的,表格模块的结构确实不依赖于数据库中表的结构,更多的依赖于应用感知的虚表,包括试图和查询 。
使用时机:
表格模块多基于面向表格的数据,所以当用结果集访问表列数据时用该模式是很有意义且明显的。 它亦将数据结构放在代码中可方便直接的访问他们。但表格模块在组织复杂逻辑时没有给我们全部的面向对象的强大功能。 直接的实例对实例关系我们没有从它这里看到,多态亦不可用。如果处理复杂的领域逻辑,领域模型会是更好的选择。基本上不得不交替使用二者的优点:领域模型处理复杂逻辑的能力与表格模型和底层面向表格的数据结构的易集成性。如果领域模型对象和数据表格相似,最好用使用活动记录的领域模型。表格模块与领域模型和活动记录合并体相比,当应用程序的许多部分基于普遍的面向表格的数据结构时更适宜。所以在java环境中并不常见到表格模块的影子,尽管行集被越来越广泛的使用了。在com和.net中记录集是应用程序中的主要数据仓库,记录集可被传递到UI,而数据敏感的窗体小组件可显示信息。微软的ADO库提供了访问关系型数据库作为记录集的方便机制。在这样的情形下表格模块将合适的业务逻辑以良构的组织形式进应用程序中。
在.net体系中数据集对象提供数据库结构的内存表示,所以创建操作此数据集的类是很有意义的 ,每个数据模块有一个数据表Data tabel成员 (数据表Data table就是.net系统中与数据集对应的类)。此读取表的功能对所有的表格模块而言是共有的,所以可出现在父型层(Layer SuperType):
class TableModule.....
protected DataTable table;
protected TableModule(DataSet ds , String tableName){
table=ds.Tables;
}
.....
见 <<企业应用程序设计模式>>
(*^__^*) 嘻嘻……
页:
[1]