设计模式在管理信息系统开发中的应用研究
2010-11-27宋娜娜
宋娜娜
(郑州航空工业管理学院 信息科学学院,河南 郑州 450015)
管理信息系统(Management Information System,MIS)是一个建立在网络环境下的综合信息管理系统,通过计算机网络,可实现企业不同部门之间数据的流通和共享,使得决策部门能及时得到需要的数据,并将决策信息反馈给各部门.管理信息系统的开发,无论是使用流行的第4代编程语言开发,还是基于Web的应用程序,人们常采用3层(表示层、业务层和持久层)体系结构,其中,对数据库的使用是必不可少的.如何方便地实现数据库的访问是管理信息系统开发过程中需要重点考虑的部分.
随着面向对象技术的成熟,在各种软件开发环境中都提供了对数据库访问的支持,一般是通过一组类来实现的,在这些类之间存在着复杂的相互依赖关系.在面向对象的设计中,最困难的是寻找合适的对象来构造软件系统,从而设计出理想的类,由于要考虑多种因素诸如封装、粒度以及灵活性,而这些因素往往是冲突的,所以如何进行权衡取舍找到一个合理的方案是相当困难的.
在软件设计工作中,当找到对于某类问题好的解决方案时,一般会从中抽象出模型并反复使用,这有助于我们将新的设计建立在以往工作的基础上并复用以往成功的设计方案,使得面向对象的设计更灵活和更具复用性.目前,面向对象技术的研究人员正在尝试使用设计模式这一概念.所谓设计模式,就是将这些面向对象的设计经验按模式名称、问题、解决方案和效果这4个基本要素系统地归类以便重用,从而构成不同设计之间通信的基础.它是一种可重用的“财富”,可以应用于不同的问题域.本文使用面向对象开发技术,应用设计模式,提出了一个在.NET开发环境中数据库访问的解决方案.
1 设计模式
1.1 设计模式简介
设计模式的思想最初来源于建筑领域,建筑师 Christopher Alexander 首先提出了设计模式的概念,尽管他描述的是建筑和规划中的设计模式,但其中体现的思想也适用于建筑设计以外的一些领域,例如面向对象软件设计领域.只是在这里,对象和接口取代了墙和门窗,但模式的核心都是一样的,即在某种环境下解决特定问题的通用方法[1].
设计模式关注的是特定设计问题及其解决方案,在每种模式中均描述一个设计问题和一个经过验证的、通用的解决方案,这个解决方案是对反复出现的设计结构进行识别和抽象得到的,它通常由多个对象组成,模式中不仅描述对象的设计,而且描述对象间的通信.同时,在每种模式中还包括该模式的适用环境、使用效果和利弊的权衡以及该模式是否与其他模式有关等内容.
设计模式的基本描述格式通常包括:
(1)模式的名称;
(2)模式要解决的问题及模式所适用的环境;
(3)一个通用的解决方案,包括模式中的组件、组件间的交互以及它们的职责、关系和协作;
(4)使用这种解决方案会产生的效果.
依据目的不同,模式可分为创建型模式、结构型模式和行为模式3类.创建型模式与对象的创建有关;结构型模式处理类和对象的组合,将一组对象组合成一个大的结构,例如复杂的用户界面;行为模式描述类或对象的交互和职责分配,定义对象间的通信和复杂程序中的控制流.
1.2 Facade模式简介
Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行.Facade模式提供了一个高层次的接口,使得子系统更易于使用.Facade模式的门面类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与门面对象打交道,而不需要与子系统内部的很多对象打交道[2].
(1)意图
为子系统中的一组接口提供一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.
(2)适用性
为一个复杂子系统提供一个简单接口时,可以使用Facade模式.
子系统往往因为不断演化而变得越来越复杂.大多数模式使用时都会产生更多更小的类,这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难.Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层.
客户程序与抽象类的实现部分之间存在着很大的依赖性.引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性.
当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点.如果子系统之间是相互依赖的,可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系.
(3)结构图
图1 Facade模式的通用结构图Fig.1 General structure of Facade pattern
2 设计模式在MIS开发中数据库设计中的应用
现在有多种流行的数据库,包括Microsoft公司的Access、Foxpro、SQL Server,IBM公司的DB/2、Oracle、Sybase等.这些数据库都支持SQL语言,所以似乎应该是可以互换使用的,但是由于这些数据库系统都有各自的用户接口和编程接口以及不同的特点,尽管它们都支持SQL,但每个数据库系统都有自己的接受SQL查询和返回查询结果的方法,所以这些系统不能互换使用.
为了解决这个问题,在.NET平台上提供了一个新的数据库访问模型ADO.NET,它由一组互相联系类组成[3]:
(1)OleDbConnection——代表了实际到数据库的连接,实际编程时可以实例化该类的一个对象,在需要时打开和关闭该对象,在使用完成后关闭它以便垃圾回收.
(2)OleDbCommand——代表发送给数据库的一个SQL命令,该命令可能不返回结果.
(3)OleDbDataAdapter——在数据库和本地数据集之间的数据交互提供一个桥梁,可以指定OleDbCommand、数据集和数据连接.
(4)DataSet——代表一个或多个数据表或查询返回结果.
(5)DataTable——代表数据库中的一个数据表或从查询返回的表.
(6)DataRow——代表DataTable中的一行.
这些类相互之间是紧密联系的,使用以上这组类进行数据库访问的一般方式如下:
a、首先创建一个数据库链路;
b、请求一个记录集合;
c、把记录集合暂存到DataSet;
d、如果需要,返回第2步(DataSet可以容纳多个数据集合);
e、关闭数据库链路;
f、在DataSet上作所需要的操作.
对数据库的访问需要这些类配合完成,直接使用这些类来完成数据库访问的任务,类之间的关系复杂,使用起来不易掌握.Facade模式是管理这些类对象的理想方法.Facade模式由两个类组成:Dbase和DBTable,其中Dbase包装了ADOConnection、Database、DataTable、ADOCommand、ADODatasetCommand类,DBTable包装了ADOCommand、Dataset、Datarow、Datatable、ADODatasetCommand类.具体实现如下:
public abstract class DBase {
protected OleDbConnection conn;
private void openConnection() {
if (conn.State == ConnectionState.Closed){
conn.Open ();
}
}
private void closeConnection() {
if (conn.State == ConnectionState.Open ){
conn.Close ();
}
}
public DataTable openTable (string tableName) {
OleDbDataAdapter adapter = new OleDbDataAdapter ();
DataTable dtable = null;
string query = "Select * from " + tableName;
adapter.SelectCommand = new OleDbCommand (query, conn);
DataSet dset = new DataSet ("mydata");
try {
openConnection();
adapter.Fill (dset);
dtable = dset.Tables [0];
}
catch(Exception e) {
Console.WriteLine (e.Message );
}
return dtable;
}
public DataTable openQuery(string query) {
OleDbDataAdapter dsCmd = new OleDbDataAdapter ();
DataSet dset = new DataSet ();
DataTable dtable = null;
try {
dsCmd.SelectCommand = new OleDbCommand(query, conn);
openConnection();
dsCmd.Fill(dset, "mine");
dtable = dset.Tables[0];
closeConnection();
return dtable;
}
catch (Exception e) {
Console.WriteLine (e.Message);
return null;
}
}
public void openConnection(string connectionString) {
conn = new OleDbConnection(connectionString);
}
public OleDbConnection getConnection() {
return conn;
}
}
类DBTable只给出粗略的定义:
public class DBTable {
protected DBase db;
protected string tableName;
private bool filled, opened;
private DataTable dtable;
private int rowIndex;
private Hashtable names;
private string columnName;
private DataRow row;
private OleDbConnection conn;
private int index;
public DBTable(DBase datab, string tb_Name) {//-----}
public void createTable() {//-----}
public bool hasMoreElements() {//-----}
public int getKey(string nm, string keyname){//-----}
public virtual void makeTable(string cName) {//-----}
private void closeConn() {//-----}
private void openConn() {//-----}
public void openTable() {//-----}
public void delete() {//-----}
}
在实际应用开发中,可使用从这两个类派生的子类并加以实例化.Facade模式为客户提供了一个简单的编程接口,客户不需使用复杂的数据库访问子系统部件.而且,使用Facade模式并不阻止客户使用底层的复杂的子系统部件,还可以更改底层的子系统而不更改客户代码.
3 结束语
在当前的软件开发中,良好的软件设计方法能够大幅度提升软件设计的质量和效率.以往,只有具有丰富软件设计经验的设计职员才能设计出结构均衡、质量保证的软件;现在,应用软件设计模式方法能够很好地重用优秀的软件设计方案,进而得到良好的设计结果.本文介绍了设计模式的一般特点,并详细分析了Facade模式.在此基础上,提出了一个使用Facade模式的数据库访问模型,并给出了实际的实现.该模型应用在实际MIS开发过程中,可以使开发人员避免使用以往的复杂的数据库访问技术,从而大大提高开发效率.
参考文献:
[1] 邹娟,田玉敏. 软件设计模式的选择与实现[J] .计算机工程,2004(10) : 29-31.
[2] ERICH G, RICHARD H, RALPH J, et al. 设计模式——可复用面向对象软件的基础:英文版[M].北京:机械工业出版社,2002:121-127.
[3] TOM A. C#技术内幕[M].侯晓霞,柴洪辉,译.北京:清华大学出版社,2002:290-305.