版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1软件体系结构
第8讲:设计模式(一)江贺2内容简介:设计模式概念设计模式的描述实例研究:文档编辑器LexiLexi的文档结构与组合(Composite)模式3设计模式概念ChristopherAlexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复的工作。”《设计模式:可复用面向对象软件的基础》:设计模式是“对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述”4设计模式概念设计模式的四个基本要素:模式名称(PatternName):一个助记名,它用一两个词来描述模式的问题、解决方案和效果。问题(Problem):描述了应该在何时使用模式。解决方案(Solution)描述了设计的组成部分,它们之间的相互关系和各自的职责和协作方式。效果(Consequence)描述了模式应用的效果及使用模式应该权衡的问题。5设计模式概念6设计模式的描述模式名和分类模式名简洁地描述了模式的本质。模式可以分为创建型、结构型、行为型。意图是回答下列问题的简单陈述:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?别名模式的其他名称。7设计模式的描述动机举例说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情境。该情景会帮助你理解随后对模式更抽象的描述。适用性在什么情况下可以使用该模式?该模式可以用来改进哪些不良设计?你怎样识别这些情况?结构对模式中的类进行图形描述,说明对象之间的请求序列和协作关系。8设计模式的描述参与者设计模式中的各个对象、类以及它们各自的职责。协作模式的参与者如何协作以实现它们的职责。效果模式怎样支持它的目标?使用模式的效果和所需做的权衡取舍?系统结构的哪些方面可以独立改变?9设计模式的描述实现实现模式时需要知道的一些提示、技术要点及应该避免的缺陷,以及是否存在某些特定于实现语言的问题。代码示例用C++/Smalltalk实现该模式的代码片段。已知应用实际应用系统中发现该模式的例子。相关模式10实例研究:文档编辑器Lexi11实例研究:文档编辑器LexiLexi设计中的7个问题文档结构:文本的数据结构安排。所有的编辑、格式安排、显示和文本分析都涉及到这样的文档结构。格式化:Lexi是如何来创建数据结构的?那些对象负责不同的格式化策略?修饰用户界面:Lexi的用户界面包括滚动条、边界和用来修饰文档界面的阴影。12实例研究:文档编辑器Lexi支持多种视感标准(look-and-feel):Lexi应该不需做较大修改即可以适应不同的视感标准,如Motif支持多种窗口系统:不同视感标准通常是在不同的窗口系统上实现的。Lexi的设计应该尽可能独立于窗口系统。用户操作:用户通过不同的界面操作Lexi,包括按钮和下拉菜单。拼写检查和连字符:Lexi如何支持像拼写检查和决定连字符的连字点这样的分析操作?当我们不得不增加一个新的分析操作时,如何尽量少修改相关类。13Lexi的文档结构与组合(Composite)模式Lexi考虑的其实是如何来安排字符、线段、多边形、图像等的基本元素。用户使用Lexi过程中,希望操作的既可以是单个字符、也可以是行、栏、表格、页等。行、栏、表格、页等都属于子结构,而这些子结构又可以包含更小粒度的子结构。字符、线段等可以看作是不包含子结构的原子型结构。14Lexi的文档结构与组合(Composite)模式字符、图片、行、栏15Lexi的文档结构与组合(Composite)模式字符、线段等原子型结构与一般子结构的关系栏行16字符、线段等原子型结构与一般子结构的动作基本一样:Draw在屏幕上画出自己Intersects判断当前光标是否落在自己上面字符、线段等原子型结构与一般子结构的均可以从同一个基类继承而来。Lexi的文档结构与组合(Composite)模式17图元18字符、线段等原子型结构与一般子结构的均从图元继承而来。其中,比如行、栏等类中包含了大量的成员变量,这些成员变量又是图元的实例。字符、线段等原子型结构与一般子结构的这种关系,实际上就是一种组合(Composite)模式Lexi的文档结构与组合(Composite)模式19组合(Composite)模式意图将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对于单个对象和组合对象的使用具有一致性。Lexi的文档结构与组合(Composite)模式20组合(Composite)模式动机在图形编辑器和图形捕获系统这样的应用程序中,用户可以使用简单的构件创建复杂的图表。用户可以组合多个简单构件以形成一些较大的构件,而这些构件又可以组合成更大的构件。一种简单实现方法是将不同粒度的构件用不同的类来定义,例如为字符、线等简单图元定义一些类,而为行、栏定义另外一些类作为简单图元的容器类。但是用户在使用过程中可能将这些容器类的行为看成和简单图元类一样!而Composite模式试图解决这样的问题,它描述了如何使用递归组合,使得用户不必对这些类进行区别,如图所示。 Lexi的文档结构与组合(Composite)模式21抽象基类既要能够反映原子图元的特性,又要能够反映一般子结构的特性2223组合(Composite)模式适用性在以下情况下使用Composite模式希望表示对象的部分-整体层次结构希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
Lexi的文档结构与组合(Composite)模式24Lexi的文档结构与组合(Composite)模式组合(Composite)模式结构25Lexi的文档结构与组合(Composite)模式26组合(Composite)模式参与者Component(Graphic)为组合中的对象声明接口在适当的情况下,实现所有类共有接口的缺省行为声明一个接口用于访问和管理Component的子组件在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现它Leaf(Rectangle,Line,Text等)在组合中表示叶节点对象,叶节点没有子节点在组合中定义图元对象的行为Composite(Picture)定义有子部件的那些部件的行为存储子部件在Component接口中实现与子部件有关的操作。Client通过Component接口操纵组合部件的对象。Lexi的文档结构与组合(Composite)模式27组合(Composite)模式协作用户使用Component类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,则它通常将请求发送给它的子部件,在转发请求前/后可能执行一些辅助性操作。Lexi的文档结构与组合(Composite)模式28组合(Composite)模式效果定义了包含基本对象和组合对象的类层次结构基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合。简化客户代码客户可以一致地使用组合结构和单个对象。通常客户不知道也不关心处理的是一个叶节点还是一个组合组件。这就简化了客户代码,因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。使得更容易增加新类型的组件新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需因新的Component类而改变。使你的设计变得更加一般化Lexi的文档结构与组合(Composite)模式29组合(Composite)模式实现(需要考虑以下几个问题)显式的父部件引用共享组件最大化Component接口声明管理子部件的操作Component是否应该实现一个Component列表子部件排序使用高速缓冲存储改善性能应该由谁删除Component存储组件最好用哪一种数据结构Lexi的文档结构与组合(Composite)模式30代码示例计算机和立体声组合音响这样的设备经常被组装成部分-整体层次结构或者是容器层次结构。例如,底盘可以包含驱动装置和平面板,总线包含多个插件,机柜包括底盘、总线等。这种结构可以很自然地用Composite模式进行模拟。Lexi的文档结构与组合(Composite)模式31代码示例Equipment类为在部分-整体层次结构中的所有设备定义一个接口。classEquipment{public:virtual~Equipment();constchar*Name(){return_name;}virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();virtualvoidAdd(Equipment*);virtualvoidRemove(Equipment*);virtualIterator*CreateIterator();protected: Equipment(constchar*);private: constchar*_name;};
Lexi的文档结构与组合(Composite)模式32代码示例Equipment的子类包括表示磁盘驱动器、集成电路和开关的Leaf类:classFloppyDisk:publicEquipment{public: FloppyDisk(constchar*); virtual~FloppyDisk(); virtualWattPower(); virtualCurrencyNetPrice(); virtualCurrencyDiscountPrice();};
Lexi的文档结构与组合(Composite)模式33代码示例CompositeEquipment是包含其他设备的基类,它也是Equipment的子类。classCompositeEquipment:publicEquipment{public: virtual~CompositeEquipment(); virtualWattPower(); virtualCurrencyNetPrice(); virtualCurrencyDiscountPrice(); virtualvoidAdd(Equipment*); virtualvoidRemove(Equipment*); virtualIterator*CreateIterator();protected: CompositeEquipment(constchar*);private: List_equipment;};
Lexi的文档结构与组合(Composite)模式34代码示例NetPrice的缺省实现使用CreateIterator来累加子设备的实际价格。CurrencyCompositeEquipment::NetPrice(){Iterator*i=CreateIterator();Currencytotal=0;for(i->First();!i->IsDone();i->Next()){total+=i->CurrentItem()->NetPrice();}deletei;returntotal;}
Lexi的文档结构与组合(Composite)模式35代码示例计算机的底盘被表示为CompositeEquipment的子类Chassis.classChassis:publicCompositeEquipment{public:Chassis(constchar*);virtual~Chassis();virtualWattPower();virtualCurrencyNetPrice();virtualCurrencyDiscountPrice();};
Lexi的文档结构与组合(Composite)模式36代码示例采取类似Chassis的方法来定义Cabinet和Bus.这样就得到了组装个人计算机所需的所有设备。Lexi的文档结构与组合(Composite)模式EquipmentFloppyDiskCompositeEquipmentchildrenChassisCabine
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论