设计模式及其在软件设计中的应用研究

更新时间:2023-05-10 18:50:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

设计模式及其在软件设计中的应用研究

Internet无疑是20世纪末伟大的技术进展之一,为我们提供了一种全球范围的信息基础设施.这个不断延伸的网络基础设施,形成了一个资源丰富的计算平台,构成了人类社会的信息化、数字化基础,成为我们学习、生活和工作的必备环境.如何在未来Internet平台上进一步进行资源整合,形成巨型的、高效的、可信的和统一的虚拟环境,使所有资源能够高效、可信地为所有用户服务,成为软件技术的研究热点.

Internet平台具有如下基本特征:无统一控制的“真”分布性;节点的高度自治性;节点链接的开放性和动态性;人、设备和软件的多重异构性;实体行为的不可预测性;运行环境的潜在不安全性;使用方式的个性化和灵活性;网络连接环境的多样性等.因此,Internet平台和环境的出现,对软件形态、技术发展、理论研究提出新的问题,也提供了新的契机. 传统软件的开发基于封闭的静态平台,是自顶向下、逐步分解的过程,因此传统软件的开发,基本都是首先确定系统的范围(即Scoping),然后实施分而治之的策略,整个开发过程处于有序控制之下.而未来软件系统的开发所基于的平台是一个有丰富基础软件资源但同时又是开放、动态和多变的框架,开发活动呈现为通过基础软件资源组合为基本系统,然后经历由“无序”到“有序”的往复循环过程,是动态目标渐趋稳态.未来软件基本模型由于所处平台的特性和开放应用的需求而变得比任何传统的计算模型都更为复杂,软件生命周期由于“无序”到“有序”的循环而呈现出不同于传统生命周期概念的“大生命周期概念”,程序正确性由于目标的多样化而表现为传统正确性描述的一个偏序集,软件体系结构侧重点从基于实体的结构分解转变为基于协同的实体聚合,软件生产过程和环境的变化导致基于Internet的面向用户的虚拟工厂的形成.

作为控制软件复杂性、提高软件系统质量、支持软件开发和复用的重要手段之一,软件体系结构(software architecture,简称SA)自提出以来,日益受到软件研究者和实践者的关注,并发展成为软件工程的一个重要的研究领域.长期以来,CMU.SEI在其网站上公开征集SA 的定义,至今已有百余种.其中较有影响力的定义包括:1)软件系统的结构(structure or structures),包含软件元素、软件元素外部可见的属性以及这些软件元素之间的关系软件系统的基本组织,包含构件、构件之间、构件与环境之间的关系,以及相关的设计与演化原则等.

这些定义一般都将构件以及构件之间的连接作为SA的基本组成部分.最初,SA概念的提出是为了解决从软件需求向软件实现(包括代码)的平坦过渡问题,认为SA是软件系统的抽象描述,可作为系统实现的蓝图,担当从需求到实现的桥梁.所以,早期的SA研究主要集中在软件生命周期的设计阶段,关注如何通过SA解决软件系统的前期设计问题,典型的研究点如体系结构描述语言、体系结构风格、体系结构的验证、分析、评估方法等。

90 年代中期, 基于面向对象理论的设计模式得到了进一步的发展, 之后Erich Gamma 等人给出了设计模式的定义.设计模式关注的是特定设计问题及其解决方案, 它描述了如何利用面向对象的基本概念和机制来解决可扩展的软件设计中经常出现的问题,并针对设计问题给出可复用的解决方案,而这个解决方案是对反复出现的设计结构进行识别和抽象得到的.同时,每个模式都伴有定义的语境和强度,语境解释了模式的适用情况,强度是语境中的元素.如果问题的环境与模式的语境和强度相匹配,该模式便可应用.因此,设计模式是软件人员在面向对象软件设计中,经多次验证的成功解的记录与提炼.设计模式的描述方法包括自然语言描述法、统一标记语言(UML)描述法、形式化语言描述法.自然语言描述法比较简单、方便,但在现实与设计之间的过渡描述不够流畅.对象建模技术(OMT)描述法是利用类图和对象图对设计模式中的类、实例以及整体模式结构进行图形描述的方法,而UML 是在OMT 基础上进一步发展起来的,其描述更加清晰和统一,符合大部分软件设计人员的习惯,也便于设计人员的理解和应用.形式化语言主要包括DisCo、LePUS、LayOM、ADV/ ADO、CDL、PDL、PDSP 等,其中DisCo 侧重于描述设计模式中参与者的交互行为。

1 模式的选取

各种模式均有其自身特点和适用范围,所以在选取模式前应充分了解模式的内涵及侧重点,发掘出不同模式的适用规律.常用模式的应用规律有如下几种.

(1)享元(Flyweight)模式.该模式可用于实现共享细粒度符号对象, 主要解决由于系统存在大量类似的、具有共性的对象而严重影响系统性能的问题.此时,可将对象的共同信息提取出来并作为一个新的Flyweight 对象, 而原有对象需要的且重复的信息描述只需要在一个共享的Flyweight 对象中描述,从而大大削减了应用程序创建的对象,降低了程序内存的占用率,增强了程序的性能.如果一个应用程序需要显示的对象同属于一种类型,就可以考虑用Flyweight 模式来共享一定数量的对象.例如,在Java 程序中,字符串、Swing 树节点、组件边界等都利用了Flyweight .如果从一个数据库中读取一系列字符串,这些字符串中有许多是重复的, 那么可将这些字符串储存在Flyweight池(pool)中.又如字处理软件, 若以单字作为一个对象的话,要是有数千个字则需数千个对象,这在处理字的同时无疑要耗费很大的内存资源,所以需要找出这些对象群的共同点, 设计一个元类, 并将共享的类封装起来.

(2)代理(Proxy)模式.该模式主要是通过代理来控制对象的访问,所覆盖的应用场合从小结构到涉及整个系统的大结构,并具有以下功能.防止越权访问功能,主要是对不同级别的用户进行权限划分和管理控制,如论坛、银行信息、图书档案管理等系统的管理控制.存取优化功能, 正如word 文档中有很大的图片,要打开该文档通常需要花费很长时间,这时需要做图片Proxy 来代替真正的图片,以便于提高存取

效率.客户端存取远程服务器信息的功能,如果直接操作Internet 远端服务器上的对象,可能会因网络运行缓慢而影响访问速度,这时需要利用Proxy .

(3)Ob server 模式.该模式的特点是在对象间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将被告知并自动更新,主要应用如下.

在界面设计中的应用.因为应用程序的开发往往要求用户界面与业务逻辑分离, 而Obse rve r 模式就是解决此类问题的最常用的设计模式.解决对象间的状态同步问题.当一个用户视图中的数据被其他用户改动后,后端的数据库能够自动更新,而当数据库以其他方式更新后,用户视图中的数据显示也会随之改变.另外,Ob serve 模式还适用于实时更新的系统,如股票系统、税务系统、网上商店等.

(4)组合(Composite)模式.该模式是将对象组织成“整体-部分”的层次结构, 即将对象组织成树状结构,从而保证客户机在使用单个对象和复合对象上的一致性.这样做,客户端不但能一致地使用组合结构或单个对象,简化了客户端的调用,也可以在组合体内部加入新的对象,而用户则无需更改代码.Composite 模式主要应用于树形结构系统, 诸如论坛这类典型的系统,另外还常用于一些涉及产品结构和配置管理的系统,此类系统可将产品的结构和配置看作是一种产品结构树,如产品由零件、部件组成,部件又由零件、部件组成.这种嵌套递归关系通常使用Composite 模式来表示.

Composite 模式也适用于界面设计,例如图形由若干基本对象组成,而这些对象的操作基本相同,亦即移动、缩放、绘制、拷贝、粘贴等.使用Composite模式可以规范设计,从而提高代码的可重用度.

(5)单件(Singleton)模式.它强调一个类仅有一个实例,主要体现系统的多选一的特性.

(6)命令(Command)模式.它将请求与执行分离,允许系统以不同请求、队列或日志请求作为参数来表示客户,并支持可取消的操作.

(7)迭代器( Iter ator)模式.它提供了连续访问一个聚集对象中的各个元素,而不需要暴露对象的内部表示方法,适用于文档的查找和遍历.

(8)策略(Str ategy)模式.它定义了一系列的算法,对每个算法进行封装,允许交互.利用该模式可使算法的变化独立于使用它的客户.还有其他模式也具有类似的适用于不同应用的一般规律,需要程序开发人员在开发具体的系统中不断体会、归纳.

2 设计模式的选取策略

现有的软件设计模式一般应用于以下2 个方面:①在软件系统设计的开始阶段就应用设计模式对软件体系结构进行设计; ②在系统的体系结构设计初步完成后,对系统另有要求的组件或模块通过加入设计模式使其更加优化、灵活.由于设计模式具有一定的复杂性,所以很难将其应用到具体的软件设计中,主要原因有两点:①软件设计人员没有正确把握和理解软件设计模式; ②没有一种有效的方法来指导使用这些设计模式.为此,本文在总结了一些软件设计模式的应用经验的基础上,借鉴了对面向对象软件工程过程的研究[ 4] ,提出了设计模式应用于软件设计的策略,步骤如下.

步骤1: 对所要解决的问题进行抽象,并划分适当的类型.

步骤2: 根据问题类型选择适合的设计模式.

步骤3: 规划问题和匹配模式, 即将所要解决的问题与所选择的设计模式进行比较,找出共性.在所要解决的问题域内考虑元素对应于模式中的类和模式中的各种角色,如果发现选择的设计模式并不合适,返回步骤3,重新进行设计.

步骤4: 对选取的模式进行变体,即对模式的原始结构进行修改或扩展,以解决具体问题. 步骤5: 设计并细化所需的软件体系结构.

步骤6: 对设计质量进行度量.设计模式的形式化描述为软件设计人员的模式自动获取提供了依据[5] ,特别是在结合了设计模式

的形式化描述和规范匹配基础上研究设计模式的自动化获取,对推动模式的应用具有重大意义.模式的自动获取建立在需求和设计均需形式化描述的基础上,这对于大多数非形式化描述的软件并不适用.将

设计模式的自动化获取与经验模式选取相结合,才能真正推动模式的广泛应用.

3.设计模式的初步选取

(1)分析问题且划分问题类型.实例系统主要是产生矢量电力接线图,通过分析和抽象,判断出该问题应该属于创建型模式.

(2)选择适合的创建型模式.在创建型模式中,Singleton 模式强调一个类仅有一个实例,因此可排除该模式.Builder 模式的特点是将复杂对象的构建与它的表示分离,这不能满足系统对图元可扩充性的要求.Factory Method 模式相对设计平台而言,增加图元必须增加相应工厂类的实例, 所以后期程序维护复杂,这也不符合系统对图元扩充性的要求.Prototype 模式对电力逻辑平台框架来说可能是最佳选择, 它仅需要为每个图元类实现一个Clone 操作, 便可减少类的数目.除此之外, 由于电力接线图是由多个图元的多个实例组成, Prototype可以较好地满足这一要求.

(3)匹配模式. 据此得出系统的体系结构.

(4)综合系统性能.用对象来表示连接图中的所有设备将占用大量的存储空间,也就是说这将影响到系统的空间性能,因此需要采用其他设计模式来修改体系结构.

本文通过对面向对象软件工程的研究,总结了软件设计模式应用的一般规律,并通过析常用模式的内涵及侧重点提出了设计模式应用于软件设计的策略,包括抽象问题、划分类型、模式初选、模式匹配、结构细化、设计优化及设计度量等.利用所提策略可快速进行模式选取,再经模式的完善设计,可以优化系统的性能,提高软件设计的灵活性.

本文来源:https://www.bwwdw.com/article/i9we.html

Top