一、开发背景
面向对象方法在软件开发的分析、设计以及编码中作用越来越重要,它 在适应系统需求变化、提高软件可重用性和开发效率方面有着其它开发方法无法比拟的优点 。面向对象思想将应用域中的概念描述成对象,应用系统由一系列对象构成,对象之间可以 传递消息,系统的运作可说就是对象间的协同工作。有过开发经验人都知道,应用系统中有 些是对象是要持久存在的,需要将它们存入磁盘,以便在重启系统时能够调入系统。这些对 象在面向对象方法中主要指实体对象,为了一致,本文中以实体对象代表所有需要存储的对 象。
目前,对象存储方式有两种:一种是存入文件,另一种是存入数据库。将对象存 入文件中,容易实现,操作简便,有很多类库已实现了此功能,但是文件存储方式难以表示 对象之间的关系,性能上也有所不足,难以满足大型系统的要求。将对象存入数据库,理想 的选择是面向对象数据库,但面向对象数据库虽有所发展,仍不成熟,还不能满足需要。关 系型数据库系统经过多年的发展,技术已经相当成熟,应用十分广泛,大部分信息系统都以 其作为后台数据管理。如今成熟的数据库产品有很多,为了降低在数据库编程方面的难度, 各种数据库访问模型相继问世,如ADO、ODBC、BDE、ADO.Net和JDBC等,虽然如此,关系型数 据库并非为适应面向对象技术而存在和发展,面向对象语言和关系数据库之间不能实现直接 对象存取,需要经过转换,为了提高开发效率,降低应用系统与数据库之间的耦合度,在二 者之间开发对象存储模块十分必要。
二、实现策略
数据库特点。数据库由 数据表构成,在面向对象编程中,数据表一般代表实体对象,表中的字段代表实体对象的属 性。由于数据表一种特殊的数据结构,每个表的字段数、字段类型与长度和其他约束均不相 同,因此建立能统一表示各数据表结构的类是很难的。数据表虽在结构上有所不同,但各数 据表也有相同之处:它们都有一个名字,表上都有共同的操作,就是如查询、增加、删除、 修改等存取操作。
实体对象与数据表之间的映射。针对数据库结构的特点,我们为 所有实体对象建立一个抽象基类,类中有实体对象名,有数据库存取操作的接口,每个接口 以数据库连接对象为参数。实体对象可从抽象基类继承,增加相关属性和属性的赋值与读取 方法,实现从抽象基类中继承而来的数据库存取接口。数据库存取接口的实现策略是:读取 实体对象名作为数据表名,用数据访问模型建立记录集,用记录集中的字段值为实体对象的 属性赋值或将属性值存入数据表中。这样就为实体对象与数据表建立了对应关系。
命令模式。实体对象与数据表的建立对应关系后,不能孤立存在,不能由其自身创建和存储 ,必须采用某种机制将它们组织起来,向应用系统提供一致服务,与其他对象交互。借鉴设 计模式中的命令模式可以完成此项功能。命令模式结构如图1所示。
图1:命令 (Command)设计模式
⑴.命令模式解决方案描述。
命令抽象类说明所有具体 命令(ConcreteCommand)支持的接口,具体命令(ConcreteCommand)封装了接收者 (Receiver)使用的服务。客户创建具体命令(ConcreteCommand),并将这些具体命令 (ConcreteCommand)绑定在指定的接收者(Receiver)上,调用者(Invoker)实际执行一 条命令或取消一条命令的执行。
⑵.命令模式结论:
①命令对象和命令算法被 分离;
②调用者(Invoker)从指定的命令中分离出来并得到保护;
③具体 命令(ConcreteCommand)是对象,它们可以进行创建和存储;
④在无须修改代码的 前提下,新的具体命令(ConcreteCommand)可以被增加进来。