设计模式在水文信息推送APP架构设计中的应用
2018-01-18,
,
(1.长江水利委员会水文局,武汉 430010;2. 深圳市华威世纪科技股份有限公司,广东 深圳 518000)
1 模式起源
设计模式(Design Pattern)是一套被反复使用、为多数人知晓、并经分类编目,关于代码设计经验的系统总结。使用设计模式是为了增强代码的可重用性,提高开发效率,让代码更容易理解,保证软件可靠性。
模式起源于建筑业而非软件业,最初由原美国加利佛尼亚大学环境结构中心研究所所长,被称为“模式之父”的Christopher Alexander博士提出。他在其专著《A Pattern Language: Towns, Buildings, Construction》中提出了“模式”的概念,应用于建筑设计。他所指的模式的内涵为:“模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案”。
20世纪80年代以来,软件工程界也逐渐关注Christopher Alexander等在住宅、公共建筑与城市规划领域的重大突破。从1995年至今,设计模式在软件开发方面得到了越来越多的企业和高校的关注与重视,如Sun公司的Java SE/Java EE平台和Microsoft的.NET平台中均应用了大量的设计模式。严格来说,只要支持面向对象编程(OOP)的程序设计语言均可使用设计模式进行编程,如C++、Java、C#、Objective-C、VB.net、Smalltalk、Ruby等。1994年,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides出版了《Design Patterns》著作,在该书中归纳了23种软件开发中使用频率较高的设计模式。
2 模式分类
面向对象编程是大量研究成果的提炼与汇总,遵循这些原则设计的程序往往具有较高的复用性、较强的灵活性。而设计模式就是遵循上述面向对象设计原则,升华总结出的经验和编程方法。
2.1 面向对象基本原则
面向对象编程(Object Oriented Programming,简称OOP)是一种计算机编程架构。传统的面向过程编程是按照特定的业务逻辑,分步执行相应的代码,重用性、灵活性及扩展性较差;而OOP则将所有业务逻辑封装为对象,每个对象都具有属性、方法,对象之间交互通过消息进行通信。OOP模式可简化编程步骤,编制的程序具有较高的重用性及灵活性。面向对象设计原则是OOP编程的核心,面向对象的设计原则(SOLID原则)主要有五方面:
(1)单一职责原则(Single Responsibility Principle)。该原则强调一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。对于具有多种功能的逻辑业务应分离成多个对象(类)。
(2)开放封闭原则(Open Closed principle)。这一原则是保持OOP设计灵活性、扩展性的核心。该原则强调“软件实体应该是可以扩展的,但是不可修改”。我们在增加系统功能的时候,不应修改现有代码,应增加新代码,以保持已有系统的稳定性。
(3)里氏替换原则(Liskov Substitution Principle)。该原则主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。
(4)依赖倒置原则(Dependency Inversion Principle)。该原则主张程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
(5)接口隔离原则(Interface-Segregation Principle)。该原则是单一职责原则用于接口设计的自然结果。一个接口中包括的功能是有限的,不同的功能可封装在不同的接口中。
2.2 设计模式分类
根据设计模式的用途分类,设计模式可分为创建型(Creational)、结构型(Structural)及行为型(Behavioral)3类。其中,创建型模式主要用于创建对象,结构型模式主要用于处理类或对象的组合,行为型模式主要用于描述类或对象如何交互和怎样分配职责。具体分类见表1。
表1 设计模式分类表
3 典型应用
限于篇幅,本文以观察者模式为研究典型,以水文信息推送APP框架设计为对象,具体说明设计模式在水文信息化软件设计中的应用。
3.1 观察者模式基本原理
观察者模式是一种行为型模式,该模式定义了对象之间一对多的依赖关系,让一个对象的改变能够影响其它对象。发生改变的对象称为观察目标,被通知的对象称为观察者。一个观察目标可以对应多个观察者。观察者模式较好地实践了单一职责原则、开闭原则、依赖倒置原则及接口隔离原则,因此在编程实践中被大量使用,著名的微软.Net平台的事件机制就采用了观察者模式的设计思路。其UML图如图1。从图可知,Subject和Observer均是接口,而ConcreteSubject和ConcreteObserver才是具体的实现类。
图1观察者模式UML图
3.2 水文信息推送APP设计
(1)问题的提出
水文信息是为防汛减灾、水资源管理及国民经济建设各领域服务的基础支撑信息。2015年3月5日,李克强总理在十二届全国人大三次会议政府工作报告中首次提出了“互联网+”行动计划。通俗的说,“互联网+”就是“互联网+各个传统行业”,但这并不是简单的两者相加,而是利用信息通信技术以及互联网平台,让互联网与传统行业进行深度融合,创造新的发展生态。
在“互联网+”的技术背景下,水文监测部门采用移动互联技术,开发相应的APP软件,将原来采集的水文信息,由用户主动请求获取的模式,升级为由数据中心主动向用户终端推送的模式。这一转变一方面可提高水文监测部门的服务水平及时效性,另一方面也提升了公众对水文监测部门的关注度。
水文监测数据的采集报送系统架构见图2。系统由监测端、传输网络、数据中心及用户终端等几个部分组成。监测端完成水位、雨量、流速等信息的采集;通过传输网络将实时数据传输至数据中心;数据中心通过数据清洗、数据在线整理整编后完成信息推算;用户终端则是水文信息的最终用户,可通过计算机、移动通信终端等设备进行数据的在线访问。
图2水文监测信息推送架构图
随着通信技术及电子信息技术的迅猛发展,用户访问数据终端出现了多元化,有手机、台式电脑、笔记本电脑等。对于不同终端,其采用的操作系统、显示界面等均有很大的差异。以操作系统为例而言,计算机终端采用Windows、Linux等,手机等移动终端采用Android(谷歌)、Linux(苹果)、Windows Mobile(微软)等。而电子信息及软件技术发展是十分迅速的,今后一定会出现新的性能优良的操作系统。因此,如何设计一个具有高度灵活性、可扩展性信息推送APP,则是本项目成功实施的关键因素之一。
(2)传统设计方案
由于不同操作系统的采用的数据连接方式、图形显示API均有较大的差别。因此需将不同操作系统所需执行的操作封装为单独的函数,见图3。在信息推送APP业务主逻辑中必然会存在多组判别的条件选择语句。这样做的弊端就是,当新的操作系统出现时,一方面需为新操作系统编写专用代码,另一方面还需修改APP的主逻辑代码(添加另一组条件判断语句),违反了面向对象设计原则的“开闭”原则,架构的灵活性不好,扩展性也较差,给系统的维护与升级造成较大的困难。
图3信息推送APP架构设计图(传统设计方案)
(3)优化设计方案
从上述设计方案可见,信息推送APP架构设计中的“变化点”是接收终端操作系统的变换。根据面向对象程序设计原则,我们应采用设计模式封装“变化点”。经分析,观察者模式是解决此类问题的最佳方案。
在本研究中,观察目标为HydroData对象,它实现了Subject接口。观察者为各类终端对象,如基于Windows系统的WindowsTerminal对象,基于IOS系统的IOSTerminal对象和基于Android系统的AndroidTerminal对象,它们都实现了Observer接口。为了对各自接收到的水位、雨量及流量信息进行显示,分别还实现了ShowInformation接口。系统设计见图4。
Subject接口中提供了NotifyObservers()、RegisterObserver()及RemoveObserver()等3个方法。RegisterObserver()方法用于向观测目标中添加观测者对象,实现消息的订阅;RemoveObserver()方法用于从观测目标中移除观测者对象,取消消息的订阅;NotifyObservers()方法用于向所用观测者对象发布消息,推送即时信息。
图4基于观察者模式的APP架构设计图
Observer接口中提供了Update()方法,用于更新观测目标发来的即时信息,并将其信息存储在缓存中。根据接口隔离原则,还提供了ShowInformation()接口,该接口ShowInfo()方法用于将收到的即时信息,更新相关的界面。
图5为HydroData业务逻辑伪代码,实现了观察目标的业务主逻辑;图6为IOSTerminal业务逻辑伪代码,实现了IOS操作系统下信息获取及更新的业务逻辑,其它操作系统的业务逻辑与IOS是相似的;图7为客户端伪代码,在这里可以添加观察者对象,发布消息。
图5HydroData业务逻辑伪代码
图6IOSTerminal业务逻辑伪代码
图7客户端伪代码
使用观察者模式后,对于新的操作系统,如华为研制的Huawei系统,只需新增HuaweiTerminal对象的业务逻辑,实现Observer及ShowInformation接口,其它逻辑不需修改,从而实现了面向对象程序设计中的“开闭”原则,增加了程序设计的灵活性及可扩展性。
4 结论与展望
设计模式的应用是为了符合面向对象设计原则,最终旨在提高代码的复用性和系统的灵活性、可扩展性。Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides提出的23种设计模式是在当时(1994年)对过去编码的经验总结。随着技术的进步,现有的设计模式远远不止这23种,据不完全统计,现有各种模式已达1 000余种。不管模式的种类如何变化、数量如何增多,其设计的初衷均是为了充分满足面向对象的设计原则,减轻程序员编码的难度,增加系统的灵活性。因此,在水文信息化软件开发过程中,应充分利用面向对象的设计思想,利用各种优秀的设计模式,编制出高内聚、低耦合的应用系统。
[1] 江华丽.基于AOP策略模式的实现机制[J].微型机与应用, 2016(35).
[2] 李瑞雪.设计模式在软件设计中的运用[J].电子技术与软件工程, 2016(23).
[3] 刘东生.设计模式及其在软件设计中的应用研究[J].数字技术与应用, 2015(7).
[4] 武光明.设计模式在全球化软件开发中的应用[J].计算机应用与软件, 2014(1).
[5] 刘 伟,胡志刚等.C#设计模式[M].北京:清华大学出版社, 2013.
[6] 伽玛等著;李英军等译.设计模式:可复用面向对象软件的基础[M].北京:机械工业出版社, 2015.