uml与设计模式.pdf
《uml与设计模式.pdf》由会员分享,可在线阅读,更多相关《uml与设计模式.pdf(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、返回总目录返回总目录返回总目录返回总目录目目目目 录录录录第第第第 10 章章章章 UML 与设计模式与设计模式与设计模式与设计模式.210.1 什么是模式.210.2 为什么要使用设计模式.310.3 模式的分类.410.4 模式的组成元素.610.5 模式的质量.710.6 一个简单的模式例子代理模式.810.7 UML 对模式的支持.910.8 应用设计模式进行系统设计.1410.9 模式选择举例评估项目.1510.10 模式应用举例形状编辑器.2010.11 小 结.36第 10 章 UML 与设计模式过去几年在面向对象领域中的一个重要突破就是提出了设计模式的概念设计模式由于实用而受到
2、欢迎它们能够表达和重用专家技术和经验能进行系统框架设计在表达上既经济又清楚从而受到人们越来越多的重视模式概念是建筑师 Christopher Alexander 提出的他提出可以把现实中一些已经实现的较好的建筑和房屋的设计经验作为模式在以后的设计中直接加以运用他还定义了一种模式语言来描述建筑和城市中成功的架构Alexander 的方法得到软件业人士的青睐在 20 世纪 90 年代掀起了一股在软件设计中应用模式的讨论1994 年 8 月召开了编程模式语言Pattern Languages of ProgramsPLoP大会尽管软件的设计模式不一定要和面向对象有关但由于面向对象很容易描述设计抽象因
3、而许多设计模式都和面向开发有关Erich GammaRichard HelmRalph Johnson 和 John Vlissides 四个人被称为四人组在 1995 年初出版了一本书Design Patterns:Elements of Reusable Object-OrientedSoftware(设计模式可重用的面向对象软件的元素)其中对设计模式进行了基本分类并且讨论了一些新的需要研究的模式不过软件界的设计模式仍然处于起步阶段远不如它在建筑业中那么成熟和完善对模式的研究有许多方面例如有的讨论如何在不同的领域内如 CORBA 和项目管理中应用模式有的则讨论模式系统希望能够识别出不同级别
4、的模式最终形成一个完整的模式系统还有的则研究组织系统的架构模式子系统责任和规则分配以及有关子系统如何通信和合作的准则而 UML 的设计师们也正在研究如何用设计模式支持软件开发过程同时 UML 本身就支持模式的表达在本章我们首先介绍模式的一些基本概念如模式的定义分类和它的优点接着将介绍 UML 对设计模式的支持最后将通过几个具体的例子来讨论如何使用设计模式进行系统设计10.1 什么是模式那么什么是模式Pattern呢Alexander 给出的定义最为经典每个模式都描述了一个在我们的环境中不断出现的问题然后描述了该问题的解决方案的核心通过这种方式你可以无数次地使用那些已有的解决方案无需再重复相同的
5、工作模式作为现实世界中的一个元素都是以下这三者之间的关系它们是特定的情景在该情景下反复出现的特定压力系统和使这些压力能够自我释放的空间配置作为语言的一个元素模式是一条指令说明了如何重复地使用这个空间配置一旦给定的情景适当就释放给定的压力系统简而言之模式是一种出现在现实世界的事物同时它也是一条告诉我们如何创建何时创建该事物的规则它既是一个过程又是一种事物既是对一个存在事物的描述又是对生成该事物过程的描述模式具有双重性它既是生成的generative又是描述的descriptive因为它既是对重复生成的架构元素的描述又是对如何以及何时创建该元素的规则从本体论ontological的观点来说模式的生
6、成的属性指模式的内容content即指反复出现的事物的自身从认识论epistemological的观点来说描述的属性指模式的形式form是我们捕捉并表述这一事物的方式通过问题情况压力解决的形式简而言之设计模式的核心是问题描述和解决方案问题描述说明模式的最佳使用场合以及它将如何解决问题解决方案是用一组类和对象及其结构和动态协作来描述的10.2 为什么要使用设计模式在软件业中设计模式是面向对象系统使用的一些可重用的已经得到了很好证明的巧妙通用简单的设计解决方案软件设计中的设计模式具有以下特性?巧妙设计模式是一些优雅的解决方案一般很难立刻设计出来?通用设计模式通常不依赖某个特定的系统类型程序设计语言
7、或应用领域它们是通用的?得到了很好的证明设计模式在实际系统和面向对象系统中得到广泛应用它们并不仅仅停留在理论上?简单设计模式通常都非常小只涉及很少一些类为了构建更多更复杂的解决方案可以把不同的设计模式与应用代码结合或混合起来使用?可重用设计模式的建档方式使它们非常易于使用正如前面提到的它们非常通用因而可用于任何类型的系统注意此处的可重用性是在设计层而不是在代码层设计模式平在类库中只有系统架构使用它们?面向对象设计模式是用最基本的面向对象机制如类对象通用化和多态等构造的那么为什么要使用模式呢首先使用设计模式就可以更准确地描述问题和它们的解决方案其次使用设计模式可以具有一致性consistency
8、即如果对一些已知的问题我们有一类标准的解决方案那么在遇到相同问题时我们能够采取一致的方法这就使代码更容易理解使用设计模式的再一个原因就是在遇到问题时无需每次都从底层做起而是可以从标准解决方案设计模式入手并对它改编使之适应特殊问题的需要这样就节省了时间并且提高了开发的质量模式为面向对象软件开发人员提供了以下机制?根据实际系统的开发经验提供对共同问题的可重用的解决方案?提供类和对象级之上抽象的名称通过设计模式开发人员能够在更高的层次上讨论方案 例如我建议我们可以用 Bridge 或 Adapter 来解决这个问题 Bridge和 Adapter 是两种设计模式?提供对开发的功能性和非功能性方面的处
9、理方案许多模式特别强调了某些面向对象设计擅长的领域区分接口和实现放松各部分之间的依赖性隔离硬件和软件平台并且具有重用设计和代码的潜能?提供了开发框架framework和工具的基础在设计可重用框架时设计模式是最基本的架构?为面向编程和设计学习提供教育和训练支持通过对设计模式的研究能够深入理解良好设计的最基本性质从而在后面的设计中加以模拟和应用10.3 模式的分类不同的书籍和论文在描述设计模式时的方式各有差异有的采用文本方式有的采用文本和建模语言模型的方式也有多种对模式的分类方法四人组书中定义了 23 种模式的分类该书的文档风格现在成为定义新模式的模板该书定义了以下几种模式分类?创建模式针对例程包
10、括创建什么对象以及如何及何时创建和类及对象的配置 允许系统中有不同结构和功能的 产品 对象 常见的创建模式有 AbstractFactoryFactory MethodPrototypeSingletonObject Pool图 10-1 是一个 Builder的例子:MessageManager1:receive(msg:MIMEMsg):MIMEParser1.1:outMsg:=parse(msg:MIMEMsg)MessageBuilder1.1.1:builder:=getInstance(to:String)builder:MAPIBuilder1.1.2:to(:String)1
11、.1.3:from(:String)1.1.4:plainText(:String)1.1.5:jpegImage(:Image)1.1.6:outMsg:=getOutboundMsg()outMsg:OutboundMessageIF new1.2:send()图 10-1 Builder 模式举例?结构模式针对在大的结构中使用类和对象的方式并把接口与实现分离开来ObjectKeyCacheManagerfetchObject(:ObjectKey)ObjectCreatercreatObject(:ObjectKey)Create-objects-for-caching11Cachead
12、dObject(:Object)fetchObject(:ObjectKey)?Cache-objects-for11Object10.*Caches?fetchercacher图 10-2 Cache Management 模式?行为模式针对在对象之间责任分配的算法以及类和对象之间的动态交互行为模式不仅仅处理对象的结构还处理它们之间的通信 Chain of ResponsibilityCommandLittle Language/InterpreterMediatorSnapshotObserverStateNullObjectStrategy TemplateMethodVisitor图
13、10-3 是 Visitor 模式ClientVisitor#navigationOperation1():AbstactElement#navigationOperation2():AbstractElement.ConcreteVisitor1ConcreteVisitor2.ObjectStructureAbstractElementConcreteElement1ConcreteElement2.Uses?Contains?10.*?UsesUses?Uses?111navagates?1110.*图 10-3 Visitor 模式10.4 模式的组成元素Alexander 说我们定义
14、的每个模式都应该以规则的形式在情景情景下产生的压力系统以及允许这种压力自我释放的配置之间建立关系他还推荐使用图来描述模式Alexander 所使用的模式的描述格式称为Alexandrian 方式在GoF中使用的称为GoF格式不管模式的记录方式有多大的区别它都应该包括一些本质的元素以下是一些公认的模式基本元素?名模式必须具有一个有意义的名这样就可以用一个词或短语来指代该模式以及它所描述的知识和结构好的模式名组成讨论概念抽象的词汇表有时一种模式可能有多个公认的名字这种情况下最好把它的绰号以及同义词在别名或也作为中列出有的模式格式还提供模式的分类?问题陈述问题并描述它的意图它在给定的情景和压力下所要
15、达到的目标和目的通常压力是阻碍完成这些目的的?情景是问题以及它的解决方法重复发生的前置条件告诉我们模式的可应用性applicability也可以把它看作应用模式前的系统初始配置?压力描述有关的压力和约束它们之间以及和要达到的目标之间是如何交互/冲突的常常使用一个具体的想法作为模式的动机motivation压力揭示了问题的错综复杂同时定义了在它们产生冲突时必须做的折衷好的模式描述应该完全封装所有对它有影响的压力?解决方案描述如何实现预期结果的静态关系和动态规则相当于给出指令来构造所需要的产品描述中可以有画图和句子它们指明模式的结构参与人和他们之间的协作进而说明问题是如何解决的解决方案不仅要描述静
16、态结构还要描述动态行为静态结构说明了模式的形式和组织而行为动态则使模式变得生动对模式解决方案的描述可能指明了在尝试构造该方案的具体实现时应该记住的指南有时也会描述该解决方案的一些变形或专有化?例子一个或多个应用模式的例子显示特定的初始情景如何应用模式模式如何改变情景以及结果的情景例子帮助读者理解模式的使用和可应用性虚拟的例子和模拟尤其具有说服力例子还可以附加一个实现例子显示解决方案实现的一种方式?结果情景在应用模式之后系统的状态或配置包括应用模式所产生的结果包括好的和坏的以及模式可能带来的其它问题它描述了模式的后置条件和边际效应这有时称作压力的释放因为它描述了哪个压力已经被释放哪个还没有释放现
17、在哪个模式是可应用的为模式产生的最后情景编制文档有助于把其它模式的初始情景关联起来因为在大型项目中一个模式通常只是完成整个任务的一小步?基本原理对模式中的步骤和规则的证明性解释告诉我们模式实际上的工作方式以及为什么要采取这样的方式为什么这样是最好的模式的解决方案组件可能描述模式的外部可见的结构和行为而基本原理组件则说明了模式内在的结构和主要的机制?相关模式在同一模式语言或系统中该模式与其它模式之间的静态和动态关系相关模式通常会有相同的压力并且会有与其它模式相容的初始或结果情景这样的模式可能是前任模式其应用导致该模式的应用也可能是后继模式其应用紧跟在该模式应用之后可能是其它可选模式针对与该模式相
18、同的问题在不同的压力和约束下提出不同的解决方案还可能是互相关的模式与该模式同时应用?已知使用描述该模式在已有系统中的出现和应用这有助于确认该模式的确是针对一个重复出现的问题的一个得到证明的解决模式的已知使用经常用作模式的使用指导虽然没有提出严格的要求但通常好的模式前面都有一个摘要提供一个简短的总结和概述为模式描绘出一个清晰的图画提供有关该模式能够解决问题的快速信息有时这种描述称为模式的缩略概要或一个模式缩略图模式应该说明它的目标读者以及对读者有哪些知识要求10.5 模式的质量除了包含上述的元素外定义良好的模式还应该具有一些重要的质量包括?封装和抽象每个模式都封装了在特定领域内一个定义良好的问题
19、以及它的解决方案模式应该有清晰的边界概念以便于明确问题空间和解决方案空间模式还应该是抽象体现了领域知识和经验并且可能出现在该领域内不同的概念层次上?开放性和可变性每个模式都应该是开放的允许对它进行扩展或被其它模式参数化来共同解决大问题模式的解决方案也应该能够有无限种实现的方式孤立地或与其它任何模式一起?可再生性和可共存性一旦被应用那么每个模式都会生成一个结果情景这个情景可能会与一个或多个其它模式的初始情景匹配而后会继续应用后面的模式直到最终生成一个完整的解决方案但模式的应用通常不是线性的很可能一个模式的一部分会在特定的抽象和精细层次上导致其它不同层次上的模式或与它们复合?平衡每个模式必须实现它
20、的压力和约束之间的某种平衡这种平衡可能来自用来使解决方案空间冲突最小化的一个或多个不变量和启发式这种不变量通常代表了解决问题最基本的原则或思想并解释了该模式中的每一个步骤或规则总之模式的目标是通过把它的每一组成部分技巧性地组织起来使它的整体和大于部分和10.6 一个简单的模式例子代理模式了解设计模式的最好办法就是去研究一个实际的模式下面我们就以代理模式为例进行讨论代理模式是一个结构模式把接口从实现中分离成不同的类它的主要思想是用一个代理对象作为另一个真实对象的代理由这个代理控制所有对真实对象的接入从而解决了当由于性质位置或接入限制而使得真实对象无法被直接实例化的问题这是一个非常简单的模式但很容
21、易说明 UML 是如何描述模式的图 10-4 是 UML 中 Proxy 模式的类图ClientSubjectRequest().Request();.ProxyRequest()RealSubjectRequest()图 10-4 把 Proxy 设计模式描述成一个 UML 类图注意Subject 是一个抽象类因而是斜体Proxy 模式涉及三个类SubjectRealSubject 和 Proxy图中的 Client 类使用该模式使用抽象类 Subject 中定义的接口在 RealSubject 和 Proxy 中都实现了 Subject 定义的接口RealSubject 实现了接口中的操作
22、而 Proxy 类则把它收到的所有调用都委托给RealSubject 去执行由 Proxy 对象控制对 RealSubject 对象的接入这一模式有以下几种应用场合?更高的性能和效率在需要真正的对象之间系统可以用廉价的代理来减少耗费当在代理处调用操作时它首先检查是否已经实例化 RealSubject 对象如果没有就把它实例化并把请求委托给它如果已经实例化了则立即转发请求这种方法在 RealSubject 对象的创建非常昂贵时很有效比如必须读取数据库复杂的初始化等许多具有很长的启动时间的系统通过使用 Proxy 模式可以显著地提高性能?授权 如果需要检查调用方是否具有调用 RealSubject
23、 对象的授权 则可以由 Proxy来完成这时调用方必须给出它自己的身份Proxy 必须和某个授权对象通信是否允许接入?局部化 RealSubject 对象可以位于其它系统中 本地的 Proxy 只是在本系统中 扮演它的角色而所有请求都被转发给其它系统本地客户只看到 ProxyProxy 模式可以有许多种变形如完成其它功能无需全部委托给 RealSubject可以改变参数的类型或操作的名词或者做一些准备工作来减少 RealSubject 的负荷这些变形体现了模式背后的思想模式是一种解决方案的核心可以有多种变形改装或扩展但不改变基本的方案在四人组的书中是用类图描述模式的用一个对象图和一个消息图有点
24、类似UML 中的序列图很多地方是用文本来描述某些方面如意图动机可应用性结构协作实现举例的代码以及模式的结合另外还包括同一模式其它的名字有类似性质的相关模式以及已知的该模式的用法模式的代码通常都简单根据需要把 RealSubject 实例化的 Proxy 类的 Java 代码很简单如图 10-5 所示public class Proxy extends ObjectRealSubject refersTo;public void Request()if(refersTo=null)refersTo=new RealSubject();refersTo.Request();图 10-5 把 Rea
25、lSubject 实例化的 Proxy 类的 Java 代码10.7 UML 对模式的支持在应用设计模式时UML 非常重要因为它允许模式作为架构的一部分如图 10-6所示图 10-6 在 UML 中模式的具体化图中 Oberserver 是设计模式同时还显示在该模式的特定使用中出现的实际的类在 UML 中模式是用一个协作描述的协作描述了情景和交互其中情景是指协作所涉及的所有对象它们之间的相互关系以及分别是哪个类的实例交互显示了在协作中对象完成的操作发送消息以及相互调用模式具有情景和交互因此很适合用协作来描述事实上是用一个参数化协作来描述的图 10-7 中的虚椭圆就是模式的符号里面是模式的名字模
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uml 设计 模式
限制150内