您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 设计模式精解(中文)
设计模式精解DesignPatternsExplained内容简介•模式的本原•模式的发展历程•用设计模式提高软件开发生产力•重构与设计模式模式的本原简单地说,模式是一个出现在世界上的实物,同时也是一条规则,告诉你应该如何创建一个实物、应该在何时创建。它既是过程,也是实物;既是对当前实物的描述,也是对创建实物的过程的描述。——C.Alexander,《建筑的永恒之道》什么是模式?模式是一种语言语言=语素(词汇)+语法(组合语素的规则)模式既是语素,也是语法无名特质•模式语言是用于描述“好”的系统。•惟有描述“好”的系统时,该语言才成其为模式语言。•不精确的自然语言无法描述无名特质。我们将其归纳为:唯心主义?•好的系统必定拥有之•拥有之的系统必定是好的无名特质之根本•任何系统皆有内应力•内应力能够合理疏解,则系统趋向于长久保存;内应力不能合理疏解,则系统趋向于崩溃•能够使内应力合理疏解之系统即具有“无名特质”•实例:材料科学、建筑学与软件科学模式的定义模式是描述特定场景(context)、特定约束(force)下以具有无名特质的方式解决特定问题(problem)之方案(solution)的专用语言。内容简介•模式的本原•模式的发展历程•用设计模式提高软件开发生产力•重构与设计模式模式的发展历程尽管Alexander所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式。只是在面向对象的解决方案里,我们用对象和接口代替了墙壁和门窗。两者的核心都在于提供了相关问题的解决方案。——GangofFour,《设计模式》建筑学中的模式ChristopherAlexander教授的“三步曲”•研究模式的理论——《建筑的永恒之道》•第一个完整的模式语言——《建筑模式语言》•理性地用模式来指导建筑过程——《俄勒冈实验》软件科学中的模式•管理模式——DonS.Olson,CarolL.Stimmel,TheManagerPool•分析模式——MartinFowler,AnalysisPatterns•设计模式•实现模式——JamesCoplien,AdvancedC++;ScottMeyers,EffectiveC++•重构模式——MartinFowler,Refactoring•……设计模式“三步曲”•了解设计模式——AlanShalloway,JamesTrott,《设计模式精解》•系统学习设计模式——GangofFour,《设计模式》•用设计模式灵活解决实际问题——JohnVlissides,PatternHatching内容简介•模式的本原•模式的发展历程•用设计模式提高软件开发生产力•重构与设计模式用设计模式提高软件开发生产力我们需要这样一种语言:它让我们高效地交流、讨论那些常见的、重复出现的设计概念,并在这些概念上建立起我们的系统。不要仅仅把模式当作解决方案,而要把它们当作设计的词汇,这些词汇可以根据一定的规则组合起来形成句子(也就是系统设计)。——BrandonGoldfedder,《模式之乐》广为人知的例子:Singleton模式//Singleton.javapublicclassSingleton{privatestaticSingleton_instance=null;privateSingleton(){}publicstaticSingletongetInstance(){if(null==_instance)_instance=newSingleton();return_instance;}}保存全类唯一的实例对客户隐藏构造子客户只能从此处获得实例这个模式的核心是什么?•精致的solution或者巧妙的trick?•C.Alexander:“每个模式是一个有三个部分的规则,它表达一定的关联、一个问题和一个解决方式之间的关系。”Force(约束)ProblemSolutionSingleton模式的核心•问题(Problem):几个不同的客户对象需要引用同样的对象,你希望确保自己拥有的这种对象不超过一个。•解决方案(Solution):用某种技巧保证该类最多只有一个实例。•约束(Force):不能直接用于多线程环境。如果需要提供线程安全性,则Java不能实现,C++亦需要借助Double-CheckedLocking模式才能实现。这样开始系统设计?对模式的误解•(未写,gigix)在开发工作中使用模式:用模式包容变化•“开放-封闭”原则:系统应该对扩展(extension)开放,同时对修改(change)封闭。•正确使用对象技术:委托(delegate)、继承(inheritance)……目的都是封装变化。•JamesCoplien:共同点/变化点分析(Multi-ParadigmDesignforC++)•AlanShalloway:分析矩阵分析矩阵“列”记录软件系统中“不同的概念”“行”记录软件“变化的情况”分析矩阵得到的结果•(这张图还没有,gigix)其他需要注意的问题•重新认识对象技术:封装(encapsulation)、继承(inheritance)……•模式之间的协同工作•按照责任划分子系统•在分析阶段运用设计模式•参见《设计模式精解》内容简介•模式的本原•模式的发展历程•用设计模式提高软件开发生产力•重构与设计模式重构与设计模式我们的设计模式记录了许多重构产生的设计结构。在设计初期使用这些模式可以防止以后的重构。不过即使是在系统建成之后才了解如何使用这些模式,它们仍可以教你如何修改你的系统。设计模式为你的重构提供了目标。——GangofFour,《设计模式》重构(refactoring)的定义•重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察之行为的前提下提高其可理解性、降低其修改的成本。•重构(动词):使用一系列的重构(名词),在不改变软件可观察之行为的前提下调整其结构,以达到提高其可理解性、降低其修改成本的目的。•重构是语义保持的(有测试作为保证)。因此重构只会使软件质量不断变好,不会造成破坏。重构的例子(ExtractMethod)voidprintOwing(doubleamount){printBanner();printDetails(amount);}voidprintDetails(doubleamount){System.out.println(“name:“+_name);System.out.println(“amount”+_amount);}voidprintOwing(doubleamount){printBanner();//printdetails.System.out.println(“name:“+_name);System.out.println(“amount”+_amount);}重构的例子(ReplaceConditionalwithPolymorphism)doublegetSpeed(){switch(_type){caseEUROPEAN:returngetBaseSpeed();caseAFRICAN:returngetBaseSpeed()-getLoadFactor()*_numberOfCoconuts;}thrownewRuntimeException(Shouldbeunreachable);}BirdgetSpeedEuropeangetSpeedAfricangetSpeed重构与设计模式的关系•设计模式是重构的目标•重构使设计模式的引入更加容易新的开发过程添加功能是否需要灵活性?否重构是模式得到变化问题是否得到解决?否是模式的未来•重构为模式的发展指明了方向•Aspect-OrientedProgramming与OO模式的结合•与敏捷(agile)方法(例如XP)的互补结合•结合模式和重构的自动化工具•完整的“大统一”模式理论EndingAndBeginningThanks!@umlchina.com
本文标题:设计模式精解(中文)
链接地址:https://www.777doc.com/doc-3362491 .html