chp8-设计模式导论_第1页
chp8-设计模式导论_第2页
chp8-设计模式导论_第3页
chp8-设计模式导论_第4页
chp8-设计模式导论_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子科技大学电子科技大学 计算机学院计算机学院. .软件学院软件学院1TP-52nChristopher Alexander教授的教授的“三步曲三步曲”q研究模式的理论研究模式的理论建筑的永恒之道建筑的永恒之道q第一个完整的模式语言第一个完整的模式语言建筑模式语言建筑模式语言q理性地用模式来指导建筑过程理性地用模式来指导建筑过程俄勒冈实俄勒冈实验验2TP-52简单地说,模式是一个出现在世界上的实物,简单地说,模式是一个出现在世界上的实物,同时也是一条规则,告诉你应该如何创建一个同时也是一条规则,告诉你应该如何创建一个实物、应该在何时创建。它既是过程,也是实实物、应该在何时创建。它既是过程,也是

2、实物;既是对当前实物的描述,也是对创建实物物;既是对当前实物的描述,也是对创建实物的过程的描述。的过程的描述。C.AlexanderC.Alexander,建筑的永恒之道建筑的永恒之道3TP-52n建筑设计师建筑设计师Christopher Alexander:n“每一个模式描述了一个在我们周围不每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。地使用该方案而不必做重复劳动。”4TP-52n人们在自己的环境中不断发现问题和找寻问题人们在自己的环境中

3、不断发现问题和找寻问题的解决方案的时候,发现有一些问题及其解决的解决方案的时候,发现有一些问题及其解决方案不断变换面孔重复出现,在这些不同的面方案不断变换面孔重复出现,在这些不同的面孔后面是共同的本质;这就是模式。孔后面是共同的本质;这就是模式。 n模式是一种问题的解决思路,它为经常出现的模式是一种问题的解决思路,它为经常出现的问题提供了通用可靠的解决方案,适用于多种问题提供了通用可靠的解决方案,适用于多种领域环境。领域环境。n模式同时也是一种表达式框架。模式同时也是一种表达式框架。5TP-52n模式所描述的问题及问题的答案都应当是具有模式所描述的问题及问题的答案都应当是具有代表性的问题和问题

4、的答案代表性的问题和问题的答案n代表性代表性以不同的形式重复出现,允许使用以不同的形式重复出现,允许使用者举一反三,将它应用到不同的环境中去。者举一反三,将它应用到不同的环境中去。n为了与其他人交流,通常还要求给这个问题和为了与其他人交流,通常还要求给这个问题和问题的答案一个名字问题的答案一个名字6TP-52n1987年年Ward Cunningham和和Kent Beck使用使用Alexander的理论发展出一个有五个模式的语言来指导的理论发展出一个有五个模式的语言来指导Smalltalk开发开发nJim Coplien搜集搜集C+语言的成例语言的成例(idioms),成例是,成例是模式的一

5、种模式的一种n从从1990到到1992年,年,GOF的成员开始他们搜集模式的成员开始他们搜集模式的工作的工作n1993年年8月,月,Kent Beck和和Grady Booch主持了第主持了第一次关于模式的会议一次关于模式的会议n模式化方法研究的开创性著作模式化方法研究的开创性著作Design Patterns7TP-528TP-52n重用重用(reuse):是目标是目标q两种重要的重用手段两种重要的重用手段nInheritance & compositionn接口与实现分离接口与实现分离q接口保持不变,分离带来灵活性接口保持不变,分离带来灵活性q多态性多态性(polymorphism)nDe

6、coupleq降低复杂性降低复杂性9TP-52n 模式名称(模式名称(pattern name) 一个助记名,它用一个助记名,它用一两个词来描述模式的问题、解决方案和效果。一两个词来描述模式的问题、解决方案和效果。n问题问题(problem) 描述了应该在何时使用模式。描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果。它解释了设计问题和问题存在的前因后果。n解决方案解决方案(solution) 描述了设计的组成成分,描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。它们之间的相互关系及各自的职责和协作方式。n效果效果(consequences) 软件效果大多关注对时

7、间软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题和空间的衡量,它们也表述了语言和实现问题10TP-52n针对问题域不同:设计模式针对面向对象的问针对问题域不同:设计模式针对面向对象的问题域;框架针对特定业务的问题域;题域;框架针对特定业务的问题域; n设计模式比框架更为抽象:设计模式在碰到具设计模式比框架更为抽象:设计模式在碰到具体问题后,才能产生代码;框架已经可以用代体问题后,才能产生代码;框架已经可以用代码表示。码表示。 n设计模式是比框架更小的体系结构元素:设计模式是比框架更小的体系结构元素: 框框架中可以包括多个设计模式。架中可以包括多个设计模式。 11TP-52n尽力

8、用一种标准的方式描述设计经验尽力用一种标准的方式描述设计经验n为设计者提供一种通用的语言为设计者提供一种通用的语言n增加复用性,减少设计的多样性增加复用性,减少设计的多样性n增强设计变更的灵活性增强设计变更的灵活性n提高设计文档的质量提高设计文档的质量n增强设计的可理解性增强设计的可理解性12TP-52nDesign Patterns: Elements of Reusable Object-Oriented Software(Addison-Wesley,1995) n由由 Erich Gamma、Richard Helm、Ralph Johnson 和和 John Vlissides 合著

9、合著-四人帮?四人帮?n对软件设计模式的研究造就了一本可能是面向对软件设计模式的研究造就了一本可能是面向对象设计方面最有影响的书籍对象设计方面最有影响的书籍 13TP-52RequirementsAnalysisDesignImplementationArchitectureFrameworkDetailed DesignxKey:= secondary emphasisx = main emphasis14TP-52n厨房现代化厨房现代化n设计一个设计一个KitchenViewer软件软件n用户可以自己布局厨房用户可以自己布局厨房n不必拘泥于某一种形式不必拘泥于某一种形式15TP-52n用户

10、单击用户单击“壁柜壁柜”图标图标n程序在工作区中央显示一个壁柜程序在工作区中央显示一个壁柜n用户调整壁柜大小用户调整壁柜大小n拖动壁柜到指定位置拖动壁柜到指定位置n释放光标释放光标n应用程序定位壁柜位置(最近确定的位置)应用程序定位壁柜位置(最近确定的位置)n用户单击用户单击“立柜立柜”图标图标n程序在工作区中央显示一个程序在工作区中央显示一个“立柜立柜”n16TP-52壁柜壁柜台面台面地柜地柜现代现代古典古典古董古董工艺工艺menudisplay areastyles17TP-52 ModernClassicAntiqueArts & CraftsWall cabinetsFloor cab

11、inetsCountertop18TP-52 ModernClassicAntiqueArts & Crafts19TP-52nKitchenViewer的具体设计目标是什么?的具体设计目标是什么?nSolutions:q不管风格如何,绘制过程不应多次重复不管风格如何,绘制过程不应多次重复q是否可提供如是否可提供如renderKitchen(myStyle)方法方法q通过参数控制绘制过程通过参数控制绘制过程q因此,因此,q应用程序在运行时必须构造一个对象族:这个设计应用程序在运行时必须构造一个对象族:这个设计必须能够在几种风格中选择!必须能够在几种风格中选择!20TP-52KitchenCli

12、entrenderKitchen()FloorCabinet ModernWallCabinetModernFloorCabinetAntiqueFloorCabinetAntiqueWallCabinetWallCabinet 21TP-52/create the antique wall cabinetsAntiqueWallCabinet antiqueWallCabinet1 = new AntiqueWallCabinet();AntiqueWallCabinet antiqueWallCabinet2 = new AntiqueWallCabinet();/create the a

13、ntique floor cabinetsAntiqueFloorCabinet antiqueFloorCabinet1 = new AntiqueFloorCabinet();AntiqueFloorCabinet antiqueFloorCabinet2 = new AntiqueFloorCabinet();/创建厨房对象,假定add()方法已经存在Kitchen antiqueKitchen = new Kitchen()antiqueKitchen.add( antiqueWallCabinet1,);antiqueKitchen.add( antiqueWallCabinet2,

14、);/render kitchen22TP-52Our design should be flexible enough to produce any of several kitchen styles.*足够灵活的代码,能够产生几种厨足够灵活的代码,能够产生几种厨房风格的任意一种房风格的任意一种23TP-52n不能单独创建具体风格类的对象不能单独创建具体风格类的对象n通过确定通过确定renderKitchen()方法的参数替代()方法的参数替代对象的创建对象的创建 new AntiqueWallCabinet(); / Only applies to antique style, Repla

15、ce!myStyle.getWallCabinet() ; /Applies to the style chosen at runtime! good!myStyle类决定了类决定了getWallCabinet()执行的版本,产生合适的壁柜。执行的版本,产生合适的壁柜。24TP-52n必须引入必须引入New ClassqKitchenStyleqMethods?q多态性在子类中的实现?多态性在子类中的实现?q考虑:如果考虑:如果myStyle是是ModernKStyle或或AntiqueKStyle的对象时,的对象时,运行中执行操作有何不同?运行中执行操作有何不同?AntiqueKStyleg

16、etWallCabinet()getFloorCabinet()KitchenStylegetWallCabinet()getFloorCabinet()ModernKStylegetWallCabinet()getFloorCabinet()25TP-52AntiqueKStylegetWallCabinet()getFloorCabinet()KitchenStylegetWallCabinet()getFloorCabinet()ModernKStylegetWallCabinet()getFloorCabinet()WallCabinet FloorCabinet AntiqueWal

17、lCabinetAntiqueFloorCabinetFloorCabinet getFloorCabinet() return new AntiqueFloorCabinet(); FloorCabinet getFloorCabinet() return new ModernFloorCabinet(); 26TP-52KitchenStylegetWallCabinet()getFloorCabinet()KitchengetWallCabinet()getFloorcabinet()ClientrenderKitchen( KitchenStyle )ModernKStylegetWa

18、llCabinet()getFloorCabinet()AntiqueKStylegetWallCabinet()getFloorCabinet()WallCabinet FloorCabinet ModernWallCabinetModernFloorCabinetAntiqueWallCabinetAntiqueFloorCabinet27TP-52nClient代码中引用了代码中引用了Kitchen,KitchenStyle,WallCabinet和和FloorCabinet类,但没有引用具类,但没有引用具体的风格类;体的风格类;n如何实现?如何实现?qmyStyle实例化,比如是类实例

19、化,比如是类ModernStyle的实例的实例q当方法当方法renderKitchenStyle()执行到()执行到nWallCabinet wallCabinet7 = myStyle.getWallCabinet();n可以明确地返回一个可以明确地返回一个ModernWall对象对象28TP-52/风格的确定通过实例化myStyle,KitchenStyle myStyle = new ModernKstyle();/ create the wall cabinetsWallCabinet WallCabinet1 = myStyle.getWallCabinet(); WallCabin

20、et WallCabinet2 = myStyle.getWallCabinet(); /create the floor cabinetsFloorCabinet FloorCabinet1 = myStyle.getFloorCabinet();FloorCabinet FloorCabinet2 = myStyle.getFloorCabinet();/创建厨房对象,假定add()方法已经存在Kitchen kitchen = new Kitchen()kitchen.add(WallCabinet1,); kitchen.add(WallCabinet2,);kitchen.add(F

21、loorCabinet1,); kitchen.add(FloorCabinet2,);29TP-52nrenderKitchen()相比以前的版本更通用()相比以前的版本更通用n适用于所有风格适用于所有风格n重复代码少重复代码少n泛化一下泛化一下30TP-52StylegetComponentA()getComponentB()ClientdoOperation( Style myStyle )Style1getComponentA()getComponentB()Style2getComponentA()getComponentB()ComponentA ComponentBStyle1C

22、omponentAStyle1ComponentBStyle2ComponentAStyle2ComponentBCollection31TP-52nClient的的doOperation( Style myStyle )方法构建了一个方法构建了一个collection实例,例如实例,例如myStyle是是Style1类的对象类的对象nmyStyle的两个操作将分别产生的两个操作将分别产生Style1ComponentA和和Style1ComponentB对象对象n这种模式能够始终确保一个协调的风格!这种模式能够始终确保一个协调的风格!32TP-52StylegetComponentA()ge

23、tComponentB()ClientdoOperation()Style1getComponentA()getComponentB()Style2getComponentA()getComponentB()ComponentA ComponentBStyle1ComponentAStyle1ComponentBStyle2ComponentAStyle2ComponentBCollection getComponentA()getComponentB()没有参数没有参数聚合了聚合了Style类类不直接引不直接引用用Style类类运行时实运行时实例化例化33TP-52- class combi

24、nation and algorithm fulfilling a common design purpose.*通过类的组合和相关算法完成公共的通过类的组合和相关算法完成公共的设计目标设计目标 设计模式设计模式34TP-521. 客户任务2. 建立任务ACA. Static viewpointB. Dynamic viewpoint3. 任务:设计模式的应用DB(i) Abstract level(ii) Concrete level(class model)(sequence or state diagram): Reference direction35TP-52n静态观点:解决如何创建

25、,由什么创建对象的静态观点:解决如何创建,由什么创建对象的问题问题n动态观点:解决怎样发挥模式的功能问题动态观点:解决怎样发挥模式的功能问题36TP-52AntiqueKStylegetWallCabinet()getFloorCabinet()KitchenStylegetWallCabinet()getFloorCabinet()ModernKStylegetWallCabinet()getFloorCabinet()WallCabinet FloorCabinet AntiqueWallCabinetAntiqueFloorCabinetFloorCabinet getFloorCabi

26、net() return new AntiqueFloorCabinet(); FloorCabinet getFloorCabinet() return new ModernFloorCabinet(); 37TP-52getWallCabinet()myStyle:KitchenStyleClientmyStyle:ModernKStylemyStyle:AntiqueKStylerenderKitchen( myStyle )wallCabinet1:ModernWallCabinetwallCabinet1:AntiqueWallCabinetModernWallCabinet()ge

27、tWallCabinet()AntiqueWallCabinet()myStyle.getWallCabinet()- IF myStyle BELONGS TO ModernKStyle - IF myStyle BELONGS TO AntiqueKStyle -38TP-52n抽象层抽象层n具体层具体层(非抽象层非抽象层)n分成两层可以使用抽象层更加通用的类来编写分成两层可以使用抽象层更加通用的类来编写客户代码,更具有通用性。客户代码,更具有通用性。39TP-52KitchenStyleKitchenClientModernKStyleAntiqueKStyleWallCabinet F

28、loorCabinet ModernWallCabinetModernFloorCabinetAntiqueWallCabinetAntiqueFloorCabinetAbstract levelConcrete level40TP-522. 客户角色(谁来用设计模式)客户角色(谁来用设计模式)*特定类的特定方法特定类的特定方法1. 设计模式应用设计模式应用Interface to the pattern (frequently abstract; possibly several classes)DPClientDPInterfaceRest of thedesign patternappl

29、icationInteracts with the design pattern only through its interface3. 运行时建立角色运行时建立角色 其他应用部分其他应用部分 No limitations41TP-52nDP的形式非常有限的形式非常有限q基于委托(基于委托(delegation)q基于递归(基于递归(recursion)42TP-52 new AntiqueWallCabinet(); / Only applies to antique style, Replace!myStyle.getWallCabinet() ; /Applies to the sty

30、le chosen at runtime! good!放弃直接调用,把构建操作委托给一个中间方法。 获得灵活性!实现委托的通用方法:通过一个类把功能委托给一个抽象类如:创建WallCabinet对象委托给KitchenStyle对象(myStyle)的方法!43TP-52requiredFunction() intermediaryFunction( ) requiredFunction() ClientclientFunction() intermediaryFunction()replace clientFunction( ) intermediaryFunction( ) 44TP-52DoerBasedoIt()DPInterfaceinterfaceMethod()ConcreteDoer1doIt()ConcreteDoer2doIt(). . .doerObject interfaceMethod( ) doerObject.doIt() Client可能是ConcreteDoer1的一个对象!实现委托45TP-52RecursionBasedoOperation()Nonrec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论