首页 > 范文大全 > 正文

创建型模式在题型库设计中的应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇创建型模式在题型库设计中的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:题型库是一个应用在考试信息系统中的计算机软件类型库,包含了表示处理各种题型数据的格式转换、显示和保存等功能的软件类。这些类在如教学辅助平台和课程自学系统等系统中都可以被应用。本文叙述了在设计题型库时,为了使题型库的复用性更高和可维护性更高所使用的一些设计思想,也就是使用设计模式中的对象创建模式来设计题型库。文章采用提出问题、解决问题和总结问题的结构,以对比说明的方式验证了设计模式的合理使用可以提高软件系统的复用性和可扩展性。文章使用UML的序列图来说明使用创建型设计模式来设计题型库的思路和方法。

关键词:软件工程;设计模式;题型库;软件复用

中图分类号:TP311 文献标识码:A DoI: 10.3969/j.issn.1003-6970.2012.03.021

Application of Construct-Pattern in Designing the Theme-Library

ZHANG Qiang

(Sichuan College of Architectural Technology Computer Engineering Department, Sichuan Deyang 618000)

【Abstract】Theme-Library is a software class library which is used in test information system, the functions in these classes include converting format of theme data, displaying and saving test data. And these classes may be used in such systems as teaching-assistant platform and system for self-study. This paper bewrite some design ideas used to enhance usability and maintain ability when the Theme-Library is designed. That is to say, those design works should be done by using some Object-Construct patterns which are included in DesignPattern. This paper have three main parts: question, solution and the postscript, and prove that correctly using design pattern can enhance the reusability and extensibility of a software system. This paper depicts the think and methods of using Construct-Pattern to design ThemeLibrary by the help of UML sequence chart.

【Key words】Software-engineering; Theme-Library; Design-Pattern; Software Reuse.

0 引 言

设计模式是在设计面向对象软件系统阶段时处理对象的创建、对象之间的组合和协作关系、以及系统中各对象责任分配的方法,使用这些方法,可以使软件系统具有高复用性、高可扩展性和高可维护性,软件工程技术发展到今天,软件工程领域已经有相当多的成熟的设计模式可供参考。我长期以来都在动手编制一套学生考试系统,首要目的是希望这套系统能辅助学生自主学习从而有效的提高教学质量。在我设计和实现这套系统的过程中,我遇到了一些设计上的难题,导致我在实现我的系统的时候反反复复地修改源代码,整个工程也进展缓慢,自己的信心和热情逐渐降低。直到我学习了设计模式之后,我的思路豁然开朗,软件技术界的前辈们给我们留下的经验里就有许多是我遇到的问题的答案,那些经验就隐藏在设计模式里。下面就简要描述我在这套系统的设计和实现中遇到的问题和设计模式所提供的解决方案。

1 系统数据模型

在所有的设计任务中首先考虑的是数据的表示,在这套考试系统中,主要的数据结构设计问题是题库的表示和试卷的表示。因为考卷内容和一套试卷的表示是一种半结构化的数据,所以采用XML文档来表示这些核心数据是理所当然的事情。比如可以用下面的XML文档片段:

上面的XML片段表示了一份C语言程序设计课程的试卷,考试时间为90分钟。三个子元素、和分别表示单项选择题、填空题和简答题等试卷的各种题型,子元素的属性表示各种题型的数量和小题分值。类似的,题库以及学生答卷也用XML文档来表示。当然,按照面向对象的设计思路,系统中每种题型的表示及其操作封装在相应的类里,这些类的集合就是题型库。

在试卷的XML文档表示里,不同的科目将要求XML文档中的有不同的子节点,子节点的结构也可以不同以表示更复杂的题型。这样,无论是哪类型的试卷都可以用XML文档来表示,只需要定义合适的子节点。这要求题型库能处理这些不同,即要求题型库有一定的可扩展性和较高的复用性。

2 设计中的问题

本套系统的运行模式是浏览器/服务器(B/S)模式,开发和运行平台采用,设计需要解决的一个首要问题是试卷在页面的呈现问题;最先的试卷的呈现页面的服务器端代码采用以下的结构(伪代码):

Switch(题型名)

{

case“singleSeletion”:

singleSelTheme singleSelThemeObj=New singleSelTheme();

resstr+=”singleSelThemeObj.GetHtml()+”;//显示单选题内容;

break;

case“blankFilling”:

blankFillingTheme blankFillingObj=new blankFillingTheme();

resstr+=”blankFillingObj.GetHtml()+”;//显示填空题内容;

break;

case “shortAnswer”:

shortAnswerTheme shortAnswerObj=new shortAnswerTheme(); resstr+=”shortAnswerObj.GetHtml()+” //显示简答题内容;

break;

}

Response.Write(resstr);//动态向页面输出内容

上段生成题型对象并调用其方法的代码用UML序列图表示如下:

首先的问题是这是一种硬编码的方式,题型库里所有的题型名及其类对象都会出现在试卷呈现代码中,即上图的客户端(Client),这一点从图1可以看得更清楚,所有的消息(单向箭头)都是从Client发出。如果题型库增加了一些新的题型,那么,这段代码里就相应的须要增加相应代码来适应。这就是题型库和页面呈现模块之间的耦合性太强,不便于系统的维护和修改。其次,在这段试卷页面内容呈现逻辑中包含页面的一些HTML标签的输出等控制页面布局的内容,而这部分内容对于每种题型都是一样的,在这里多次重复显得非常臃肿。类似于试卷内容页面呈现问题,学生答卷保存的问题也涉及到题型库对象的生成和使用问题,当然类似的问题会在考试系统的各个部分普遍存在!

3 对象生成模式和模式选择

前述系统设计中的问题可总结为:页面呈现模块(客户端)做了服务对象的创建任务,而这个任务是题型库的责任,页面呈现模块只应该知道要创建的对象的接口,而不是具体的对象。在设计模式中,有一些模式专门用于对象的生成,使用这些对象生成模式可以使开发出的系统的可维护性和适应性更强,或者说,使开发出的系统更具柔性。现有的常用对象生成模式及其主要用途列表如下:

工厂方法(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。

抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

生成器(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

原型(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

单件(singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

所以,对照上表中各个生成模式的用途和本系统设计遇到的问题,我觉得选择生成器模式可以最好地解决本系统的设计问题。把题型对象集合看作是一个复杂对象,这些对象如何构建的任务有生成器来完成。页面呈现模块只应负责页面元素的HTML呈现任务,它应该只需从那些题型对象得到每个大题内容的HTML表示即可。下面列表是采用生成器设计模式后,页面呈现模块的主要对象和职责:

Builder:根据某一具体的试卷XML文件创建表示各种题型的题型对象,以对象数组返回。

Constructor:用对象数组中每个对象的相应方法实现页面的构建。

下面的伪C#代码描述了在客户端(页面呈现模块)中创建和使用题型库的过程。

Builder myBuilder=new conBuilder1(试卷文档路径,题库文档路径);//生成具体的生成器对象。

myBuilder.Create();//题型库对象生成

ArrayList themesList=myBuilder.GetThemes();//返回题型库对象列表

foreach(ITheme themeObj in ArrayList)

{

Response.Write(“+themeObj.GetHtml()+”);}

对比页面呈现代码的原来版本,现在的代码简单明了,因而易于维护和修改。整个题型对象的生成过程用UML序列图表示如下:

图中的Client对象就是本文讨论的考卷内容呈现页面,而对于Client而言,虚线框里的一切都是不可见的,它只知道得到的对象列表的元素的接口以便于引用那些题型对象的相应方法,比如GetHtml()等。当然,生成器的内部设计也可以使用其它设计模式,比如抽象工厂模式等。

可扩展性和易于修改:比如,如果要求每种题型的出题具有随机性,只需定义一个Builder的子类,并重新实现其中的各个题型类。或者从原来的题型类派生新类并重定义方法,使这些子类满足功能需求就可以了,客户端代码只做一点改变,如下所示:

Builder myBuilder=new conBuilder2(试卷文档路径,题库文档路径);//生成具体的生成器对象。

而其他的代码无需改变。现在的页面呈现代码可以适应任意的题型内容的页面呈现任务,而对于新的题型的显示也能适应,因为题型库中处理这种新题型的类会把其内容的HTML代码交给页面呈现代码。

4 结语

在题型库的使用领域,比如题库的编辑,其中的插入小题、删除及修改等功能都是针对一个题库进行操作,也就是说要确保在使用题库对象时只能有一个题库是当前题库,设计模式中的单件模式可以满足这样的要求。总之,创建型设计模式的合理使用有效增加了我设计的题型库系统的复用性、可扩展性和可维护性。我期待着设计模式中的结构模式和行为模式能解决我的系统设计中遇到的对象结构和对象交互问题。

参考文献

[1] (美)Erich Gamma,Richard Helm,Ralph Johnson,等著,李英军,马晓星等译.设计模式:可复用面向对象软件的基础.机械工业出版社,2010.

[2] (美)Roger S.Pressman.梅宏.软件工程:实践者的研究方法.机械工业出版社,2002.

[3] (英)Perdita Stevens,Rob Pooley.包晓露,赵晓玲.使用UML―关于对象和组件软件工程.人民邮电出版社,2003.