论设计模式在工作中的运用

           摘要:2010年,我参加了湖南某矿业监控平台的开发,在这次项目中,我担任了系统设计和开发的工作。该项目是湖南某矿业的一个集水质污染数据的采集,监测,报警,统计,和对数据采集仪器进行控制的平台。本论文结合作者的实践,讨论了设计模式在这次开发中的运用,包括设计中用到的几种设计模式,主要有观察者模式,工厂模式,策略模式等,并且为以后系统设计的复用提供了可能。通过这些模式的使用,有效的提高了系统的灵活性,扩展性和可维护性。这个项目的成功实施,有效的监控了矿业的排污,为企业的污染治理提供了决策,从而为建设绿色环保型企业贡献了一点绵薄之力。

        本论文先讨论设计模式的理论概念,然后介绍湖南某监控平台,接着介绍在本项目中使用到的几种设计模式以及运用这些模式的原因和取得的效果,最后是讨论系统可以改进的地方。

                             

                                                                        正文

   设计模式是人们在多年的软件设计中积累下来,对可复用设计的一个总结。使用设计模式,能够提高系统的可扩展性,可靠性,可重用性。在GOF介绍中,一共有23种设计模式,分为了三个类别:创建型,结构型和行为型。其中创建型主要是对象实例化的抽象,包括:工厂模式,建造者模式,单例模式,原型模式。 结构型主要是将各种类或者对象结合在一起形成更大的结构,主要有:装饰模式,适配器模式,门面模式,享元模式,代理模式,合成模式,桥接模式。行为型主要是在不同的对象之间划分责任和算法的抽象,主要有:策略模式,命令模式,迭代模式,观察者模式,中介者模式,模板模式,访问者模式,备忘录模式,职责链模式,状态模式,解释器模式。

            湖南某矿业是一家矿业的开采,生产,加工的大型公司。为了有效及时的监控企业的排污,公司急需一套能够检测水质的平台。这次我们设计的这个平台,就是这样的一个集水质污染数据的采集,检测,报警,统计和对数据采集仪进行管理的平台,它由.NET(c#)+SqlServer2005+PLC开发。平台的架构主要由C/S和B/S组成,C/S由采集仪,PLC通讯层,工控机组成,其中采集仪完成数据的采集,PLC负责工控机和采集仪之间的通讯,工控机负责对采集仪的控制,完成数据的采集,用不同监测图的显示监测数据,以及将实时数据传输至数据库服务器持久化。B/S由客户PC,数据库服务器和WEB服务器组成,其中数据库服务器负责实时数据的存储,WEB服务器和客户端PC一起负责实时数据的检测,监控,污染浓度超标时的报警,以及实时数据的管理(查询等)。网络图示如下所示:


                                 
 

       经过我们的分析,从系统的可扩展性和灵活性出发,在检测平台中,有三个地方可以运用设计模式:

    1)C/S中的工控机隔时采集数据,一旦采集到了数据,就要进行不同格式的监测图展示,如网格,柱状图,曲线图,而且以后有可能会有新的监测图加入。如果把数据采集和监测图展示混合在一起,不利于以后的扩展。观察者模式是一种将主题(SUBJECT)和观察者(OBSERVER)职责分离的一种设计模式,观察者在感兴趣的主题上注册,当主题对象的状态发生变化时,就通知所有注册的观察者更新自己,所以在这里使用观察者模式比较合适,在.NET里,一般用事件或者委托。我们可以把不同的统计图看做是观察者,其主要功能是接收数据,绘制图形。把数据采集者看做是被观察者,其主要功能是进行数据采集。数据采集者公布一个”更新“事件,每一个监测图类在这个事件上注册,当数据采集者一旦有新的实时数据过来时,就立即”通知“不同的统计图,从而这些不同的统计图接受到来自数据采集者的数据,进行各自的绘图。这样设计,将各自的职责分开了,非常清晰,而且有利于数据监测图的扩充,如果要增加新的检测图显示,系统可以非常方便的添加。设计类图的如下所示: 
   
                                                                   
                                               

    2)B/S中的报警功能,当不同浓度的污染物超标时,要对公司的管理人员进行不同方式的报警,如果按照一般的思路,这里将会有多个IF/ELSE判断混杂在我们的类里,耦合度比较大,以后要来修改比较麻烦。策略模式是一种将各自的算法封装,使得这些算法可以相互替换而不影响客户端的一种设计模式。所以在这里我们决定采用策略模式:将不同浓度下采取的不同报警封装为不同的策略类,此外,建立一个上下文类,进行不同浓度的条件判断选择对应的具体策略类。这样一来,提供给外部的就只有一个上下文类了,从而将IF/ELSE判断进行了封装,将算法和环境独立开来,有利于类与类之间的高内聚,低耦合。设计类图如下所示:


                                              

     

    3)B/S中的数据库持久化。现在数据库服务器上我们使用的SQL SERVER2005.随着业务的发展和数据量的增大,未来有可能使用其他类型的数据库。工厂模式是一种创建型的设计模式,它“生产”出客户端所需要的“产品”,使客户端在不涉及到复杂的创建细节下“消费”和使用该产品,免除了直接创造该产品的责任,所以在持久化这里采用了工厂模式。 整个B/S部分分为如下几层:WEB表现层,BLL业务逻辑层,IDAL数据持久接口层,SQLServerDALSQLSERVER数据持久层,DALFactory数据持久工厂类,Model实体层。其中IDAL是数据持久层的接口,定义了操作Model的方法。SQLServerDAL是具体的数据持久层,此处是SQLServer,它实现了IDAL.DALFactory是数据库持久层的工厂类,它根据在web.config中XML配置的具体持久层程序集名称,使用反射的方法实例出具体的数据持久层。系统的各层关系为:WEB引用BLL,BLL通过DALFactory的工厂方法获取具体的数据持久层。当我们需要实际的数据持久层时,就只要通过DALFactory就可以了。这样一来,如果以后要替换其他的数据库,我们只要开发出实现了IDAL的具体数据库持久层,修好web.config里的XML配置就可以了,非常方便系统持久层的修改。设计类图如下所示:


                                    

    如上所述,在系统的设计中,考虑了系统中的不变和可变的地方,使用了观察者模式,工厂模式和策略模式,不但提高了系统的扩展性,可修改性,灵活性,而且有利于设计的复用,为以后类似的项目开发,打下了一个良好的基础。值得指出来是,系统中还存在一些需要改进的地方,例如,现在的工控机与PLC通讯层是采用串口来通信的,耦合性比较大,还没有将通信的这一部分抽象出来。如果未来采用其他的方式来通讯,例如TCP,就有可能造成极大的修改。所以这个地方也是需要以后来继续完善的一个地方。

猜你喜欢

转载自www.cnblogs.com/wangsanfeng/p/9109612.html