声明:本文为本人在软考系统架构设计师备考期间的练手写作,不保证内容的原创性与正确性,仅供参考,请勿照抄和用于学术论文等正规场合,因不当使用产生后果一律自负。

摘要

  2019年3月,我单位联合某高校研发了《程序在线评测比赛考试系统》。系统以程序代码在线提交自动评测功能为核心,分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等,支持对接教务平台。在项目中我担任系统架构师,负责架构设计工作。
  本文以该系统为例,主要论述了软件设计模式在项目中的具体应用,着重介绍了装饰器、策略、工厂方法三种模式。装饰器模式实现试题在不同场景下的扩展功能,提高功能定制灵活性;策略模式实现评测机不同语言的编译执行方法,降低模块耦合度;工厂方法模式实现数据库不同类型的统一访问,提高系统的可扩展性。这些模式改善了设计质量和开发效率,最终系统顺利上线,获得了用户的一致好评。

正文

  笔者在一个专为高校建设计算机专业智能教学一体化平台的单位任职,过往成果有《计算机组成原理仿真实验系统》等。2019年3月,我单位联合某大学研发了《程序在线评测比赛考试系统》项目(以下简称为“OJ系统”),以取代原有传统的编程上机考试平台。
  系统以程序代码的在线提交自动评测功能为核心,主要分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等。题库模块主要负责试题和测试用例的管理,用户根据试题要求编写程序代码提交到系统,系统将测试用例与程序代码发送给评测机模块,由评测机自动编译、执行、判分,并将结果发送给其他相关模块进行统计;实验作业模块用于在线布置作业,从题库中选取试题,设置截止日期等要求;考试模块用于学生在线考试,按教师预先设置的参数自动从题库随机抽题生成试卷,以及向教务平台上传考试成绩;比赛模块主要用于ACM竞赛的培训;抄袭判定模块用于鉴定代码与他人代码雷同率;用户管理模块负责用户信息的管理。在这个项目中,我担任了系统架构师的职务,主要负责系统的架构设计相关工作。
  一般来说,设计模式可分为创建型模式、结构型模式、行为型模式三种。创建型模式抽象了实例化过程,它们帮助一个系统独立于创建、组合和表示它的那些对象,包括工厂方法、抽象工厂、生成器、原型、单例模式等。结构型模式涉及到如何组合类和对象以获得更大的结构,包括适配器、桥接、组成、装饰、外观、享元、代理等。行为模式涉及到算法和对象间职责的分配,不仅描述对象或类的模式,还描述了它们之间的通信模式,包括观察者、策略等。
  在OJ平台的开发中,我们综合使用了多种设计模式。本文着重对装饰器模式、策略模式、工厂方法模式3种设计模式在该项目中的具体应用进行介绍。

1. 装饰器模式

  OJ系统中,全部的试题数据都存放在题库服务中,包括题目介绍、测试用例等公共内容。同一试题在自由练习、实验作业、考试、比赛等不同使用场景下,需要增加不同的扩展功能。例如:实验作业功能需要限定编程语言,并且只允许用户在给定的代码框架中编辑指定的部分。为了解决此问题,我们使用了装饰器模式,给试题对象动态添加职责。在设计装饰器模式中,我们定义了四种角色:被装饰对象的基类、具体被装饰对象、装饰者抽象类、具体装饰者。被装饰对象的基类定义为Problem类,定义一个可动态添加职责的对象接口;具体被装饰对象定义为ConcreteProblem类,继承自Problem类,用以实现具体试题内容;装饰者抽象类定义为Decorator类,维持一个指向Problem实例的引用,并定义一个一致的接口;具体装饰者类根据不同的场景,分别定义为TaskDecorator、TestDecorator、ContestDecorator等类,用以实现不同场景的扩展功能。通过使用装饰器模式,我们可以在任何时候实现新的装饰器,给试题功能添加新的职责,而无需修改原有试题功能,比继承方式拥有更好的灵活性。

2. 策略模式

  根据业务需求,OJ系统的评测机需要同时支持对C语言、C++、Java、PHP、Python等多种常用编程语言程序的评测。不同语言对应的编译与执行方法存在较大差异,例如:C语言需要先调用cl再调用link,生成exe后执行;Java需要先调用jdk的javac编译器,生成class后,再调用jre执行;Python等语言无需编译可直接解释执行。为了解决此问题,我们采用了策略模式将不同语言的编译和执行方法封装起来,并使它们可以相互替换。在设计策略模式中,我们定义了三种角色:环境角色、抽象策略角色、具体策略角色。环境角色持有一个抽象策略角色StrategyCompile接口的引用,并通过StrategyCompile接口,来实现一个具体的编译和执行方法;抽象策略角色定义所有具体策略类所需的统一访问接口;具体策略角色包装了不同语言编译程序的具体调用方法,给每种语言分别定义了CStrategyCompile、JavaStrategyCompile、PythonStrategyCompile等具体策略类。通过使用策略模式,评测机可根据不同的语言类型,选择不同的具体方法来编译执行程序代码,降低了模块的耦合度,提高了软件的可扩展性和可维护性。

3. 工厂方法模式

  因OJ系统采取分布式架构部署,不同的模块根据不同的业务需求,选用了不同种类型的数据库,包括MySQL、Oracle、SQL Server三种。在程序设计过程中如果直接使用每种数据库的原生访问方法,将会使业务逻辑复杂化,并且在开发完成后很难再变更为其他数据库类型。为了解决这一问题,我们使用了工厂方法模式。在设计工厂方法模式中,我们定义了抽象产品、具体产品、抽象工厂、具体工厂四种角色。抽象产品定义了数据库操作DataAccess类,包括数据库连接开关、查询执行、事务等基本公用方法;具体产品继承自抽象产品类,根据数据库类型,建立MySQLDataAccess、OracleDataAccess、SQLServerDataAccess类,分别进行了不同的具体实现;抽象工厂建立一个DataAccessFactory类,定义一个通用的返回数据库操作类的方法;具体工厂继承自抽象工厂,根据不同的数据库类型,分别实现返回不同种数据库具体的操作类。通过使用工厂方法模式,可以有效解决不同数据库类型对软件程序的影响,当需要更换和添加新的数据库类型时,也不需要修改具体的业务逻辑,具有很好的可扩展性。

总结

  通过采用了以上的设计模式,基本达到了预期的效果。系统自2019年10月正式上线已运行一年有余,在学校的日常教学考试和竞赛培训中投入使用,截至目前已有3000以上的学生用户、评测了70000条以上的程序代码,获得了单位同事领导和学校教师们的一致好评。不可避免的,我们在设计过程中,也存在一些问题和不足,不少开发人员在实现过程中有时还是习惯于原有的过程化设计方法,对模式的使用有些抵触。而且,这些设计模式在应用过程中,往往不是单独使用,需要多个模式综合运用。这方面,我们还缺少相关的经验。
  实践证明,OJ系统项目能够顺利上线,并且稳定运行,与系统选用了合适的设计模式密不可分。经过这次OJ平台的开发后,我也看到了自己身上的不足之处,在未来还会不断地更新知识,完善本系统的设计,使整个系统能够更加好用,更有效地服务于高校师生。

论软件设计模式及其应用相关推荐

  1. 软件设计模式-7种设计原则总结

    7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同.其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭:里氏替换原则告诉我们不要破坏继承体系:依赖倒置原则告诉我们要面向接口 ...

  2. [摘抄]软件设计模式的几个原则

    原文地址:软件设计模式的几个原则 模式是一种对现实世界的概念抽象,建筑模式,设计模式,营销模式,商业运作模式各行各业都有自己的模式. 这里说的设计模式是软件设计里的模式,主要是指面向对象的软件设计.遵 ...

  3. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)

    [系统架构设计师]软考高级职称,一次通过,倾尽所有,看完这篇就够了,学习方法和技巧这里全都有. 2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用) 论软件设计模式及其应用 软件设 ...

  4. 探索软件设计模式(二)

    我们在前面的文章中已经介绍了一些软件的设计模式,并给出了一些非软件的例子.下面,让我们继续完成软件设计模式的探索,来看看这些模式中的行为模式及实例. 行为模式 作者总结了十一种行为模式.这些模式可以在 ...

  5. 软件设计模式—命令模式

    前篇--软件设计模式-基础 前篇--软件设计模式-三种工厂模式 前篇--软件设计模式-装饰者模式 前篇--软件设计模式-单例模式 前篇--软件设计模式-原型模式 命令模式是对象行为型模式 目录 1. ...

  6. 软件设计模式从何而来?------“抄袭来的” 设计模式

    博主:爱码叔 个人博客站点: icodebook 公众号:漫话软件设计 专注于软件设计与架构.技术管理.擅长用通俗易懂的语言讲解技术.对技术管理工作有自己的一定见解.文章会第一时间首发在个站上,欢迎大 ...

  7. 软件设计模式--软件设计演变过程

    一.写这篇文章的原因 1.C语言能够使用设计模式吗?? 2.为什么要有软件设计模式?不学行不行? 3.怎么能够成为一个好的开发者,为什么有经验的人比你开发快,代码架构还好? 4.C++作为C的扩展,为 ...

  8. 系统架构师论文-论软件设计模式的应用

    论软件设计模式的应用 [摘要] 本人2004年有幸参加了中国石油集团的高性能数控测井系统项目的开发研制工作.该系统是在当前测井成套测井装备的基础上,为了满足高精度,高性能,高效率的要求开发的测井系统. ...

  9. 【软件设计模式】常用的设计模式的介绍

    软件设计模式 概念: 是一套反复使用的.多数人知晓的.经过分类编目的代码设计经验总结.是一种用于对软件系统中不断重现的设计问题的解决方案进行文档化的技术,是一种共享专家设计经验的技术. 目的: 在特定 ...

  10. 23种设计模式——软件设计模式概述

    文章目录 23种设计模式--软件设计模式概述 1.软件设计模式的产生背景 2.软件设计模式的概念与意义 2.1. 软件设计模式的概念 2.2. 学习设计模式的意义 3.软件设计模式的基本要素 4.23 ...

最新文章

  1. 简述bios在计算机系统中的作用,BIOS的主要作用
  2. Beaglebone Black开发板安装驱动
  3. *45.程序的装入方式
  4. 复数矩阵QR分解算法的C++实现
  5. boost::ptr_container::ptr_inserter相关的测试程序
  6. Linux 命令之 ulimit 命令-控制shell程序的资源
  7. 从 Storm 迁移到 Flink,美团外卖实时数仓建设实践
  8. 为什么数字中台是企业应用新基建?
  9. CCF201412-2 Z字形扫描(模拟)
  10. SpringSecurity Filter顺序
  11. 智能优化算法:生物地理学优化算法-附代码
  12. 半车模型悬架系统的simulink仿真
  13. 应用程序无法启动,因为应用程序的并行配置不正确 解决方案
  14. 音视频编解码基础知识
  15. 盘点2017企业服务领域最受关注的100家厂商(BPM平台篇)
  16. vue中click无效问题
  17. 指令流水线 —— 分类和多发技术
  18. BLDC控制方案简介
  19. 大数据应用与医学检验平台结合(论文)
  20. org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key

热门文章

  1. 基于LED的室内可见光通信系统
  2. mpeg2是信源还是信道编码_hdb3编码到底属于信源编码还是信道编码?
  3. c语言读写txt坐标文件数据,用c语言读写sgy格式的地震数据文件.pdf
  4. Windows Server AppFabric 简介
  5. 电脑坏掉之后,Oracle数据恢复
  6. Windows中的NTUSER.DAT文件是什么?
  7. 关于sqlserver中SqlParameter的用法注意事项
  8. 谷歌企业邮箱:应用专用密码
  9. [EXP]CVE-2019-0604 Microsoft SharePoint RCE Exploit
  10. Jenkins 之插件 Publish JUint test result reports 的使用