李建东
(蒙自市智慧城市运营管理中心 云南省蒙自市 661199)
根据上级领导的安排,我组织我们单位的技术人员和软件公司的技术人员为市政府开发一套OA 系统,该系统的使用范围为全市所有单位,该系统通过接口可以与州级的OA 系统实现互联。该系统包括办公管理、发文管理、收文管理、档案管理、个人事务、图书管理、信息管理、会议管理以及车辆管理等功能。在该系统的开发中我担任系统架构设计师(项目负责人)的角色,主要负责系统架构设计和需求分析的工作。
软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。组织方式描述了系统的组成构件和这些构件的组织方式。惯用模式则反映众多系统共有的结构和语义。按照Shaw 和Garlan的分类,软件体系结构风格分为5 类,其中:
(1)数据流风格,包括批处理序列风格和管道过滤器风格。
(2)调用/返回风格,包括主程序/子程序风格、数据抽象和面向对象风格、分层系统风格。
(3)独立构件风格,包括进程通信风格、事件驱动系统风格。
(4)虚拟机风格,包括解释器风格和基于规则的系统。
(5)仓库风格,包括数据库风格、黑板系统风格、超文本系统风格。
除了上述5 种风格外比较常用的一种风格是分布式架构风格,它包括客户机/服务器(C/S)风格、浏览器/服务器(B/S)风格。
在管道/过滤器风格中,每个构件都有一组输入和输出,数据输入构件,经过处理以后,产生数据输出。所以,构件被称为过滤器,而这种风格中的连接件就好像是数据流传输的管道。unix 中shell程序的编写以及编译器主要应用了这种风格。在数据抽象和面向对象风格中,数据的表示方法和对它们的相应操作被封装在一个对象或抽象数据类型当中,在这种风格中构件是对象,或者说是抽象数据类型的实例。而对象间交互的方式是连接件,对象是通过函数和过程调用来进行交互的。数据抽象和面向对象风格的应用十分的广泛,现在面向对象的系统都属于这种风格,它经常与其它架构风格一起使用。在事件驱动系统中构件不直接调用一个过程,而是广播或触发一个或多个事件。系统中的其它构件中的过程在一个或多个事件中注册。当一个事件被触发,系统自动调用在这个事件中注册的所有过程,这样,一个事件的触发就导致了另一个模块中的过程的调用。在面向对象系统中的某事件的单击事件、双击事件就应用了这种风格。在数据库系统风格中,构件主要有两类,一类是中央共亨数据源,保存当前系统的数据状态;另一类是多个独立处理单元,处理单元对数据元素进行操作。它主要应用在数据库管理系统中。
设计模式是人们在长期的开发实践中良好经验的结晶,它提供了一个简单、统一的描述方法,使人们可以复用这些软件设计方法、过程管理经验。一个设计模式通常由四部分组成:
(1)模式名。模式名就是给模式取的一个助记名。
(2)问题。描述了应该在何时使用模式,即在解决何种问题时可使用该模式。
(3)解决方案。描述设计的组成成分,它们之间的交互以及职责的分配。
(4)效果。描述了模式应用的效果以及使用模式时应权衡的问题,即模式的优缺点。按照目的和用途的不同,设计模式可分为创建型模式、结构型模式和行为型模式三种。创建型模式主要用于创建对象。结构型模式主要用于处理类或对象的组合。行为型模式主要用于描述类或对象的交互以及职责的分配。其中创建型模式包括:工厂方法、抽象工厂、原型模式、单例模式、建造者模式。结构型模式包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、亨元模式、代理模式。行为型模式包括:职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法、访问者模式。
适配器模式将一个类的接口转换成客户需要的另外一个接口,从而使接口不兼容的类可以相互调用。桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。组合模式将对象组合成树形结构以表示“整体—部分”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。装饰模式可以动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。外观模式为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。中介者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其松散耦合。
通过对OA 系统需求的获取和分析,我们知道该系统的用户主要有两类,一类是办公室用户,他们在办公室里通过局域网使用OA,而另一类用户是外出用户,他们通过Internet 使用OA,而管理员有全市系统管理员和单位系统管理员,全市系统管理员可以添加、删除全市的所有人员,而单位系统管理员可以添加、删除本单位的所有人员,该系统的主要功能包括办公管理、收文管理、发文管理、信息管理、个人事务、档案管理、图书管理、会议管理以及车辆管理等。基于上述的需求,我们决定采用C/S 和B/S 的混合架构风格来设计整体架构。而选择5 种经典架构风格中的某几种风格来设计内部架构。在该系统的整体架构设计中,外出用户访问OA系统,我们采用了B/S 架构。对于外出用户由浏览器通过internet访问Web 服务器,通过Web 服务器再访问数据库服务。这样做的好处在于外出用户只需要一台可以上Internet 的计算机就可以通过浏览器使用OA,而无需下载安装客户端软件。出于Internet 网安全性的考虑,我们在Internet 和Web 服务器之间安装了一台VPN网关。办公室用户访问OA 系统,我们采用C/S 架构。对于办公室用户由客户端软件通过局域网直接访问数据库服务器。这样做的好处在于C/S 架构的数据查询和修改的响应速度较快、交互性较强、网络负载较小。
在该系统中通过采用管道/过滤器风格,实现通用收文流程和通用发文流程之间的对接。在每个单位中,通用收文流程中收到的外单位发来的公文,可以通过通用收文流程中的选择发文类别来选择所需的发文类别,如:局长、副局长、某某科室长、所有人员、某某人等,根据需要也可以多选,然后单击发文,该文件便通过通用收文流程接口输出,通用发文流程中有相应的接口对应获取并分析处理数据,根据发文类别把文件发到相应人员的OA 系统里。通过这种方式减少了文件存储和转发、多次人员选择等的工作量,提高了工作效率。通过采用事件驱动系统,实现了会议安排管理和会议室安排情况、后勤管理的对接。由于整个行政中心的会议室都是共用的,在该系统中会议管理人员只需要按照要求在会议安排管理中输入参会人数及所需要的软硬件环境等,并点确定后,系统将自动调出符合输入参会条件,并且未被安排的会议室安排情况表,并且自动通知负责该会议室的后勤管理人员做好后勤服务准备。当所有后勤管理人员都确定收到这些消息并做好准备后,系统将自动出现某某会议室已做好开会的准备的提示。通过这种方式实现了整个会议安排管理的自动化,无需手动操作更多的内容,当以后改进系统的时候,可以很方便地操作。此外由于该系统是采用面向对象的思想进行的开发,我们在开发系统时抽取了很多类,如:管理员类、某某市管理员类、某某市某某单位管理员类、用户类、流程类、发文流程类、收文流程类等等,类之间通过继承实现了重用,类通过实例化生成了对象,对象间通过发送消息进行交互,所以该系统大量使用了数据抽象和面向对象风格。该系统的数据库管理系统中使用了数据库系统风格实现了数据的共亨。该系统在Web 页面中,使用了超文本系统风格实现了构件按照人类的思维方式任意跳转。
在该系统开发中,我们也大量使用了设计模式,在页面设计中使用了装饰模式,这样如果用户对开发的页面显示效果不满意,通过添加具体装饰类的方法,可以在不影响其它对象的情况下,动态的改变页面的显示效果,也可以很方便的撤销原来的显示效果。在登录模块的设计中,我们采用了外观模式。登录模块根据用户输入的用户名确定该用户的类别,它是系统管理员还是一般用户,是全市的系统管理员还是单位的系统管理员。然后根据相应的用户类别,选择相应的接口,进入相应的页面。
在该系统中,需要对用户和系统管理员进行查找,需要按收发文条数对各单位进行排序。而这些常用的算法在我们的类库中都有相应的类,为了提高查找和排序的效率,我们决定重用类库中的快速排序算法类和二分查找算法类。但快速排序算法类和二分查找算法类的接口不是OA 系统所兼容的接口,如果对接口进行修改将导致大量代码的修改。此时我们采用了适配器模式,把快速排序算法类和二分查找算法类的接口适配成OA 系统所兼容的接口。在短信模块的设计中,我们使用了中介者模式。在整个模块中有一个守护进程在一直运行,相当于一个中介者,用户是否在线,以及新短信存在与否,这些同事对象都是通过守护进程这个中介者与客户端发生交互的。个人事务的设计中,使用了组合模式。将对象组合成树形结构以表示“整体—部分”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在收发文流程的设计中,我们使用了职责链模式。使拟稿者、核稿者、签发者、发文者等多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合关系。
在该系统的开发中我们也遇到了一些问题,一是各单位的电脑形形色色,有配置高的,有配置低的,有的电脑甚至用了十年都没有更换,然而C/S 架构中的客户端软件既要完成用户与应用间的对话功能,又要处理业务逻辑,这种胖客户端的形式使某些配置低的电脑很难承当这种负载,从而导致响应速度慢甚至死机的现象,后来我们对办公室用户OA 的使用采用了三层C/S 架构,以减轻客户端的负载。二是开发中不要过度使用设计模式,为了使用设计模式而使用设计模式。使用设计模式的前提是,明确该模式是否符合问题的场景,并且应该权衡利弊,比如使用代理模式能在一定程度上降低系统的耦合度,但缺点是会使请求的处理速度变慢,并且实现代理模式需要额外的工作。在请求处理速度要求高的模块中,就不适合使用代理模式。
在该项目的开发中,选用了多种软件体系结构风格及设计模式。整个系统各个模块相对独立,实现了松散耦合,使系统具有很好的开放性、易扩展性、易移植性、灵活性。节省了开发和维护成本,提高了系统的开发效率。