面向对象技术Object-OrientedTechniques面向对象的设计模式Object-OrientedDesignPatterns-3-Review:Object-OrientedDesignPrinciplesLSP:Liskov替换原则TheLiskovSubstitutionPrincipleOCP:开放-封闭原则TheOpen-ClosePrincipleSRP:单一职责原则TheSingleResponsibilityPrincipleISP:接口隔离原则TheInterfaceSegregationPrincipleDIP:依赖倒置原则TheDependencyInversionPrinciple……-4-学习线路图OOUML::OOAOOPDP…Case-Study…:::……………………学习线路图-5-References[GoF94],ErichGamma,RichardHelm,RalphJohnson,JohnVlissides,DesignPatterns:ElementsofReuseableObject-OrientedSoftware(李英军等译,设计模式—可复用面向对象软件的基础,机械工业出版社,2000年)[Mart02],RobertC.Martin,AgileSoftwareDevelopment-Principles,Patterns,andPractices(邓辉译,敏捷软件开发-原则、模式与实践,清华大学出版社,2003年)[Gold01],BrandonGoldfedder,TheJoyofPatterns:UsingPatternsforEnterpriseDevelopment(熊节译,模式的乐趣,清华大学出版社,2003年)[Larm01],CraigLarman,ApplyingUMLandPatterns,2e(姚淑珍、李虎等译,UML和模式应用-面向对象分析与设计导论,机械工业出版社,2002年)-6-内容安排从原则到模式设计模式GoF设计模式及应用GRASP职责分配模式模式与编程语言模式与重构-7-内容安排从原则到模式设计模式GoF设计模式及应用GRASP职责分配模式模式与编程语言模式与重构-8-模式?如何在已排序的值列表中查找一个数组?1.将列表一分为二。将要查找的值与中间元素的值相比较。如果相等,就找到我们要查找的值。如过要查找的值小于中间元素的值,将中间点设置为列表的新的顶点(并再次将列表一分为二)。如果要查找的值大于中间元素的值,将中间点设置为列表的新的尾点。然后再将列表一分为二。继续这种分割过程,直到列表不能再分为止。此时,如果要查找的值不再最后两个元素中,它就不在这个列表中。2.使用二分查找-9-设计?Maslov:如果你唯一的工具是锤子,你就会把所有的东西都当作钉子!1.绝大多数开发人员和设计人员都是程序员出身,他们习惯于最熟悉的工具—即编写代码的文本编辑器—来思考!2.设计主要是一个交流的活动,而程序员的交流能力通常非常糟糕!BuildforToday,DesignforTomorrow!-10-设计模式?-11-模式PatternAdecorativedesign,asforwallpaper,madeupofelementsinaregulararrangementArecognizablecombinationofaction,qualities,etc.,characteristicofaparticularpersonorpopulation通用问题的解决方案来自建筑行业ChristopherAlexander1977年《APatternLanguage》-12-ConceptofPatternsEachpatterndescribesaproblemwhichoccursoverandoveragaininourenvironments,andthendescribesthecoreofthesolutiontothatproblem,insuchawaythatyoucanusethissolutionamilliontimesover,withouteverdoingitthesamewaytwice.--ChristopherAlexander,APatternLanguage,1977-13-模式的形式模式的一个主要目标就是以一种别人容易接受的方式,捕捉那些重复出现的问题的解决方案模式的形式:名称意图动机适用性结构参与者协作效果实现example-14-模式简史-11964ChristopherAlexander出版了NotesontheSynthesisofForm,该书尝试从一个不同的角度来看待建筑的过程1977ChristopherAlexander出版了APatternLanguage一书1987WardCunningham和KentBeck开始将一些建筑学概念应用到使用SmallTalk语言的软件开发中1992JimCoplien出版了AdvancedC++:ProgrammingStyleandIdioms一书1992PeterCoad在ACM上发表了他在分析模式方面的研究成果1993ErichGamma的博士论文以及JohnVlissides、RalphJohnson和RichardHelm的其它研究成果在ECOOP93上发表1993KentBeck、GradyBooch、JimCoplien以及其他人组成了Hillside小组,提供一个讨论模式的论坛-15-模式简史-21994第一次编程模式语言(PatternLanguageofProgramming,PLoP)大会举行1994DesignPatterns:ElementsofReusableObject-OrientedSoftware出版1996FrankBuschmann与其他人合作出版了Pattern-OrientedSoftwareArchitecture:ASystemofPatterns一书1997MartinFlower出版了AnalysisPatterns:ReusableObjectModels一书1999MartinFlower与其他人合作出版了Refactoring:ImprovingtheDesignofExistingCode一处……-16-内容安排从原则到模式设计模式GoF设计模式及应用GRASP职责分配模式模式与编程语言模式与重构-17-设计模式什么是设计模式?设计就是解决方案—对某个问题的解决如果某个解决方案对某类问题都很有用这时就把它总结出来这就产生了设计模式-18-设计模式是:优秀的设计范例从优秀设计方案中发现和总结出来的经验在实践中反复出现的设计问题的优秀解决方案设计者相互交流的基本术语:设计语言培养优秀设计师的一条捷径不是:面向对象设计的框架可供简单组合的设计元件发明创造出来的创新思路解决面向对象设计问题的完整方案-19-设计模式的基本要素1.名称:用于助记,形象表示这个模式2.问题:这个模式可以解决什么问题3.解决方案:这个模式怎样解决这个问题的步骤与方法4.效果:使用这个模式与不使用这个模式有什么区别,它有什么优点和缺点一个问题可以有多种解法,好的解法都可以找到很多种,每种都有优缺点;所以编程时不要死记方法,应该活学活用-20-设计模式的基本思想-1软件是在不断进化的需求在不断改变,所以软件应该适应变化设计模式是为了让软件更加适应变化,有更多的可复用性;就是有变化时你不用从头重写一次这个软件如何适应变化?就应该封装变化,让变化的影响最小封装复杂性,提供简单的接口-21-设计模式的基本思想-21.松耦合2.针对接口编程,而不是针对实现编程3.继承、组合、委托、多态、参数化-22-内容安排原则与模式设计模式GoF设计模式及应用GRASP职责分配模式模式与编程语言模式与重构-23-经典设计模式:GoF创建型结构型行为型类FactoryMethodAdapter_ClassInterpreterTemplateMethod对象AbstractFactoryBuilderPrototypeSingletonAdapter_ObjectBridgeCompositeDecoratorFacadeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitorGoF(GangofFour)23种经典设计模式-24-GoF模式分类-1根据模式的目的(用来完成什么工作的)创建型模式结构型模式行为型模式根据模式的作用范围(是处理类还是处理对象的):类模式对象模式-25-GoF模式分类-2创建型模式创建型类模式将对象的部分创建工作延迟到子类创建型对象模式将它延迟到另一个对象中结构型模式结构型类模式使用继承机制来组合类结构型对象模式描述了对象间的组装方式行为型模式行为型类模式使用继承描述算法与控制法行为型对象模式则描述一组对象怎样协作完成单个对象无法完成的工作-26-GoF设计模式创建型结构型行为型类FactoryMethodAdapter_ClassInterpreterTemplateMethod对象AbstractFactoryBuilderPrototypeSingletonAdapter_ObjectBridgeCompositeDecoratorFacadeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitorGoF23种经典设计模式-27-GoF应用-State模式-1//修改LegoSystem源代码caseBLUE:BlueProcess();break;LegoSystem::ProcessColor(){switch(color){caseRED:RedProcess();break;caseGREEN:GreenProcess();break;caseYELLOW:YellowProcess();break;}};-28-State模式-2目的:允许一个对象在其内部状态改变时改变其行为结构适用性:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示State模式将每一个条件分支放入一个独立的类中;这使得可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化-29-State模式-3-30-State模式-4LegoSystem::ProcessColor(){Color-Process();};CColor{public:virtualvoidProcess();}voidCRed::Process(){RedProcess();};voidCGreen::Process(){RedProcess();};voidCYellow::Process(){RedProcess();};//仅需要增加新的类,//原有代码不需要任何变动voidCBlue::Process(){BlueProcess();};State模式满足OCP-31-汉堡店-1增加奶酪?加入洋葱?-32-汉堡店-2加入洋葱?加入西红柿?-33-汉堡店-3加入西红柿?-34-汉堡店-4:问题类爆炸性增长(指数级别:2n)再增加一种调料(如生菜),则多出8个类继续增加一种调料(如番茄酱),则多出16个类破坏单点