《第8章设计模式1》由会员分享,可在线阅读,更多相关《第8章设计模式1(70页珍藏版)》请在金锄头文库上搜索。
1、第七章第七章 设计模式概述模式概述7.1 模式的起源及软件模式7.2 设计模式的概念、描述及分类7.3 设计模式与软件体系结构7.4 设计模式的原则和使用方式7.5 设计模式的重要性模式的起源模式的起源 建筑学建筑学2模式之父模式之父 Christopher Alexander博士博士 美国加美国加利佛尼利佛尼亚大学大学环境境结构中心研究所所构中心研究所所长A Pattern Language: Towns, Buildings, Construction,给出了出了253个建筑和城市个建筑和城市规划模式划模式模式的定模式的定义3Alexander 给出了关于模式的出了关于模式的经典定典定义:
2、 每个模式都描述了一个每个模式都描述了一个在我在我们环境中不断出境中不断出现的的问题,然后描述了然后描述了该问题的的解决方案解决方案的核心,通的核心,通过这种方式,我种方式,我们可以无数次地可以无数次地重用那些已有的解决方案重用那些已有的解决方案,无需再重复相,无需再重复相同的工作同的工作A pattern is a solution to a problem in a context 模式是在特定模式是在特定环境中(前提条件下)解决目境中(前提条件下)解决目标问题的一种的一种可重用(已确可重用(已确认)方案)方案 模式存在的意模式存在的意义解决一个解决一个问题:从模式可以得到解,而不:从模式
3、可以得到解,而不仅仅是抽象的是抽象的原原则或策略或策略是一个被是一个被证明了的概念明了的概念:模式通:模式通过个个记录得到解,而得到解,而不是通不是通过理理论或推或推测解并不是解并不是显然的然的:对大多数比大多数比较困困难的的设计问题来来说,以非直接的方式得到解是必要的以非直接的方式得到解是必要的4软件模式的出件模式的出现1990年,年,软件工程界开始关注件工程界开始关注 Alexander 博士在建博士在建筑与城市筑与城市规划划领域研究的重大突破。最早将域研究的重大突破。最早将这种种“模式模式”的的思想引入思想引入软件工程方法学的以件工程方法学的以“四人四人组(Gang of Four,Go
4、F)自称的四位著名自称的四位著名软件工程学者,他件工程学者,他们在在1994年年归纳发表了表了23种在种在软件开件开发中使用中使用频率率较高的高的设计模式,模式,旨在用模式来旨在用模式来统一沟通面向一沟通面向对象方法在分析、象方法在分析、设计和和实现间的的鸿沟沟5GoF6Erich Gamma:苏黎世苏黎世大学计算机科学博士,是大学计算机科学博士,是Eclipse、 JUnit 等项目主等项目主要技术负责人之一要技术负责人之一John Vlissides:斯坦福:斯坦福大学计算机科学博士,大学计算机科学博士,原原IBM研究员研究员Ralph Johnson:康奈:康奈尔大学计算机科学博士,尔大
5、学计算机科学博士,伊利诺伊大学教授伊利诺伊大学教授Richard Helm:墨尔本:墨尔本大学计算机科学博士,原大学计算机科学博士,原IBM 研究员,现在研究员,现在IBM咨咨询集团供职询集团供职软件模式的概念件模式的概念软件模式是将模式的一般概念件模式是将模式的一般概念应用于用于软件开件开发领域,即域,即软件开件开发的的总体指体指导思路或参照思路或参照样板板软件模式并非件模式并非仅限于限于设计模式,模式,还包括架构模式、分析包括架构模式、分析模式和模式和过程模式等,程模式等,实际上,上,在在软件生存期的每一个件生存期的每一个阶段都存在着一些被段都存在着一些被认同的模式同的模式模式的核心思想是
6、通模式的核心思想是通过增加抽象增加抽象层,把,把变化部分从那些化部分从那些不不变部分里分离出来部分里分离出来7软件模式是件模式是 对通用通用设计问题的重复解决方案的重复解决方案对真真实世界世界问题的的实践的践的/具体的解决方案具体的解决方案面向特定的面向特定的问题环境境权衡利弊之后得到的衡利弊之后得到的“最佳最佳”解决方案解决方案领域域专家和家和设计老手的老手的“杀手手锏”用文档的方式用文档的方式记录的最佳的最佳实践践在在讨论问题的解决方案的解决方案时,一种可交流的,一种可交流的词汇在使用(重用)、共享、构造在使用(重用)、共享、构造软件系件系统中,一种有效地中,一种有效地使用已有的智慧使用已
7、有的智慧/经验/专家技家技术的方式的方式8软件模式不是件模式不是 仅仅限于面向限于面向对象的象的软件件设计未未经检验的想法的想法/理理论或新的或新的发现仅仅使用使用过一次的解决方案(只有一次的解决方案(只有经过三个以上不同三个以上不同类型或不同型或不同领域的系域的系统的校的校验,一个解决方案才能从候,一个解决方案才能从候选模式升格模式升格为模式)模式)以模式的形式描述以模式的形式描述过时的技的技术和方法和方法抽象原理或启抽象原理或启发性的构想性的构想在任何在任何环境下都适用的通用解决方案境下都适用的通用解决方案“万精油万精油”或或“万能万能药”9推荐的参考推荐的参考书10经典教材经典教材英文版
8、英文版经典教材经典教材中文版中文版参考教材参考教材刘伟著刘伟著参考教材参考教材入门级入门级设计模式的概念模式的概念11软件件设计中的坏味道(中的坏味道(设计缺陷)缺陷)典型表典型表现过于僵化于僵化(Rigidity):):软件件难以增加新功能,哪怕是以增加新功能,哪怕是简单的功的功能,存在大量的硬能,存在大量的硬编码,使代,使代码的灵活性非常差的灵活性非常差过于脆弱于脆弱(Fragility):):软件的一件的一处修改往往修改往往导致看上去没有关致看上去没有关系的另一个地方出系的另一个地方出现故障故障复用率低复用率低(Immobility):无法重用):无法重用项目中其他部分的功能,目中其他部
9、分的功能,只能只能简单的粘的粘贴代代码来代替重用来代替重用粘度粘度过高高(Viscosity):破坏系):破坏系统原来框架和意原来框架和意图的改的改动方式方式比保留比保留这些内容更加容易,是一种些内容更加容易,是一种错误的代的代码维护方案方案不透明性不透明性(Opacity):一个模):一个模块难以理解以理解12可可维护性和可重用性性和可重用性较差差OOP过程中痛苦的是什么?程中痛苦的是什么?1、选择太多,无从下手太多,无从下手publicprotectedprivate继承承组合合实现继承承接口接口继承承成成员变量量局部局部变量量2、没有正确答案:、没有正确答案:不知道我不知道我们是否真正的
10、是否真正的实现了面向了面向对象的要求,看象的要求,看别人人写的写的东西都是垃圾,自己写的西都是垃圾,自己写的东西慢慢也成西慢慢也成为了垃圾了垃圾问题总结为:怎怎样才能才能实现好的好的设计,什么才是好的,什么才是好的设计高可复用性,高灵活性,高高可复用性,高灵活性,高扩展性展性高内聚,低耦合高内聚,低耦合13设计模式的提出背景模式的提出背景“选择太多,无从下手太多,无从下手”的解答:一下子得到复用性和灵活的解答:一下子得到复用性和灵活性好的性好的设计,不可能或非常困,不可能或非常困难;所以,内行的;所以,内行的设计者通者通常会复用以前使用常会复用以前使用过的可行的的可行的软件件设计解决方案解决方
11、案“没有正确答案没有正确答案”的解答:已的解答:已经验证过、被多次使用的、面、被多次使用的、面向向对象的象的设计就是很好的就是很好的设计设计模式的目的就是将面向模式的目的就是将面向对象象软件的件的设计经验记录下来,下来,可以作可以作为面向面向对象象软件件设计的的“武林秘籍武林秘籍”,我,我们掌握了掌握了设计模式,加上不断的灵活模式,加上不断的灵活应用,就可以用,就可以说是是OO行家,就行家,就可以站在巨人的肩膀上作出好的可以站在巨人的肩膀上作出好的设计14设计模式的提出背景模式的提出背景设计模式(模式(Design Pattern)是随着面向)是随着面向对象技象技术的的出出现和广泛使用而提出的
12、和广泛使用而提出的在一个在一个设计完成之前,有完成之前,有经验的面向的面向对象象设计师往往要重往往要重复使用若干次,而且每次都要复使用若干次,而且每次都要进行改行改进。当然,不能只用。当然,不能只用最初的方法解决每个最初的方法解决每个问题,常常重复使用那些,常常重复使用那些过去用去用过的的解决方案。而解决方案。而这些些经验也正是他也正是他们成成为专家的法宝,家的法宝,这就就是是设计经验的价的价值将将设计面向面向对象象软件的件的经验记录成成“设计模式模式”,可以方便,可以方便地重用成功的地重用成功的设计和和结构,将已构,将已证实的技的技术表述成表述成设计模模式也会使新系式也会使新系统开开发者更加
13、容易理解其者更加容易理解其设计思路思路15设计模式的模式的发展史展史1987年年,Kent Beck 和和 Ward Cunningham 借借鉴 Alexander 的模的模式思想在程序开式思想在程序开发中开始中开始应用一些模式用一些模式 ,在,在OOPSLA会会议上上发表了他表了他们的的成果;成果;1990年年,OOPSLA与与ECOOP联合合举办,Erich Gamma 和和 Richard Helm 等人开始等人开始讨论有关模式的有关模式的话题 (Bruce Anderson主持主持),“四人四人组” 正式成立,并开始着手正式成立,并开始着手进行行设计模式的分模式的分类整理工作;整理工
14、作; 1991年年,OOPSLA会会议上上 Bruce Anderson 主持了首次主持了首次针对设计模式模式的研的研讨会,模式逐会,模式逐渐成成为人人们讨论的的话题;1994 年年,由著名的,由著名的 Hillside Group 发起,在美国召开了第起,在美国召开了第1届关于面届关于面向向对象模式的世界性会象模式的世界性会议,名,名为 PLoP (Pattern Languages of Programs, 编程程语言模式会言模式会议);1995年年, 四人四人组出版了出版了设计模式:可复用面向模式:可复用面向对象象软件的基件的基础一一书,成成为当年最当年最抢手的面向手的面向对象象书籍,也
15、成籍,也成为设计模式的模式的经典典书籍。籍。16设计模式的定模式的定义定定义1:是一套被反复使用、多数人知:是一套被反复使用、多数人知晓的、的、经过分分类编目的、代目的、代码设计经验的的总结,使用,使用设计模式是模式是为了可重用代了可重用代码、让代代码更容易被更容易被他人理解、保他人理解、保证代代码可靠性可靠性定定义2:是从:是从许多多优秀的秀的软件系件系统中中总结出的成功的可复用的出的成功的可复用的设计方方案,可以帮助案,可以帮助设计者更快更好地完成系者更快更好地完成系统设计定定义3:是一些是一些设计面向面向对象的象的软件开件开发的的经验总结,一个,一个设计模式模式事事实上是系上是系统地命名
16、、解地命名、解释和和评价某一个重要的、可重价某一个重要的、可重现的面向的面向对象象的的设计方案方案定定义4:是:是对被用来在特定被用来在特定场景下解决一般景下解决一般设计问题的的类和相互通信和相互通信的的对象的描述,是在象的描述,是在类和和对象的象的层次描述的可重复使用的次描述的可重复使用的软件件设计问题的解决方案的解决方案17设计模式的定模式的定义 summary设计模式是特定模式是特定场景的通用景的通用设计解决方案解决方案通用通用被反复使用,或者已被成功被反复使用,或者已被成功实践践证实过的的可以复用,提高可以复用,提高质量与效率量与效率特定特定场景景设计模式是无模式是无穷无尽的,不同无尽
17、的,不同场景或者同一景或者同一场景不同景不同动机都会机都会产生不同的生不同的设计模式模式可复用但勿套用,必可复用但勿套用,必须理解理解设计模式的使用模式的使用场景与目景与目标18设计模式的一个例子模式的一个例子19需要解决什么需要解决什么问题?20考考虑一个一个软件件应用用场景,一个景,一个软件系件系统可以提供多个外可以提供多个外观不同的按不同的按钮(如(如圆形按形按钮、矩形按、矩形按钮、菱形按、菱形按钮等),等),这些按些按钮都源自同一个基都源自同一个基类,不,不过在在继承基承基类后不同的子后不同的子类修改了部分属性从而使得它修改了部分属性从而使得它们可以呈可以呈现不同的外不同的外观,怎么,
18、怎么创建不同按建不同按钮的的对象更方便呢?象更方便呢?解决方案解决方案 简单工厂模式工厂模式21创建建这些按些按钮时,不需要知道,不需要知道这些具体按些具体按钮类的名字,只的名字,只需要知道表示需要知道表示该按按钮类的一个参数,并提供一个的一个参数,并提供一个调用方便用方便的方法,把的方法,把该参数参数传入方法即可返回一个相入方法即可返回一个相应的按的按钮对象象应用用实例例 权限管理系限管理系统22系系统根据存根据存储在数据在数据库中的用中的用户权限等限等级(以整数形式存(以整数形式存储),),创建不同等建不同等级的用的用户对象,并象,并实现不同不同权限的操作限的操作应用用实例例 权限管理系限
19、管理系统23public abstract class User public void sameOperation() System.out.println(修改个人修改个人资料!料!); public abstract void diffOperation();public class Manager extends User public Employee() System.out.println(“创建建经理理对象!象!); public void diffOperation() System.out.println(“经理理拥有有创建和建和审批假条批假条权限!限!); 应用用实例例
20、权限管理系限管理系统24public class UserFactory public static User getUser(int permission) if(0=permission) return new Employee(); else if(1=permission) return new Manager(); else return null;应用用实例例 权限管理系限管理系统25public class Client public static void main(String args) User user; int permission = findPermission(
21、zh,123); user=UserFactory.getUser(permission); user.sameOperation(); user.diffOperation(); 方案的方案的评价价26适用适用场景景:负责创建的建的对象比象比较少,不会造成工厂方法少,不会造成工厂方法中的中的业务逻辑太太过复复杂;客;客户端只知道端只知道传入工厂入工厂类的参数,的参数,对于如何于如何创建建对象不关心象不关心优点点:将:将对象的象的创建和建和对象本身象本身业务处理分离,降低系理分离,降低系统的耦合度;通常的耦合度;通常实现为类静静态方法,通方法,通过类名直接名直接调用,用,非常方便,而且只需要非
22、常方便,而且只需要传入一个入一个简单的参数即可的参数即可缺点缺点:简单工厂工厂类集中了所有集中了所有产品的品的创建建逻辑,一旦不,一旦不能正常工作,整个系能正常工作,整个系统都要受到影响;增加了都要受到影响;增加了类的个数,的个数,且一旦添加新且一旦添加新对象就得修改象就得修改创建建逻辑,对象象较多多时可能造可能造成成创建建逻辑过于复于复杂,不利于系,不利于系统的的扩展和展和维护设计模式的要素及描述方式模式的要素及描述方式27设计模式的四要素模式的四要素模式名称(模式名称(pattern name)它用一两个它用一两个词来构成助来构成助记名名模式的目的模式的目的/问题(problem) 描述了
23、描述了应该在何在何时使用模式,解使用模式,解释了了设计问题和和问题存在的前因存在的前因后果,以及使用模式必后果,以及使用模式必须满足的一系列先决条件足的一系列先决条件解决方案解决方案(solution) 描述了描述了设计的的组成成分,它成成分,它们之之间的相互关系及各自的的相互关系及各自的职责和和协作方式,因作方式,因为模式可模式可应用于多种不同用于多种不同场合,所以解决方案并不描合,所以解决方案并不描述一个特定而具体的述一个特定而具体的设计或或实现,而是提供,而是提供设计问题的抽象描述的抽象描述和怎和怎样用一个具有一般意用一个具有一般意义的元素的元素组合来解决合来解决这个个问题效果效果(co
24、nsequences) 描述了描述了应用效果及使用模式用效果及使用模式应权衡的衡的问题(限制和(限制和约束因素)束因素)28设计模式的描述方式模式的描述方式29设计模式模式名和分类结构实现别名意图动机适用性协作参与者效果代码示例已知应用相关模式设计模式的描述方式模式的描述方式30u模式名和分类:模式名简洁地描述了设计模式的本质u别名:模式的其他名称u意图:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?u动机:说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景u适用性:什么情况下可以使用该设计模式?该模式可用来改进哪些不良设计?如何识别这些情况?u结
25、构:采用对象建模技术对模式中的类进行图形描述u参与者:指设计模式中的类及对象以及它们各自的职责设计模式的描述方式模式的描述方式31u协作:模式的参与者如何协作以实现其职责u实现:实现模式时需了解的一些提示、技术要点及应避免的缺陷,以及是否存在某些特定于实现语言的问题u代码示例:用来说明怎样实现该模式的代码片段u效果:模式如何支持其目标?使用模式的效果和所需做的权衡取舍?系统结构的哪些方面可以独立改变?u已知应用:实际系统中发现的模式的例子,每个模式至少包括两个不同领域的实例u相关模式:与这个模式紧密相关的模式有哪些?其不同之处是什么?这个模式应与哪些其他模式一起使用?设计模式的分模式的分类32
26、设计模式的分模式的分类根据模式的目的根据模式的目的(即用来做什么)可分(即用来做什么)可分为:创建型模式建型模式(Creational):主要用于:主要用于创建建对象象结构型模式构型模式(Structural):主要用于:主要用于处理理类或或对象的象的组合合行行为型模式型模式(Behavioral):主要用于描述:主要用于描述类或或对象怎象怎样交互交互 和怎和怎样分配分配职责根据模式用于根据模式用于处理理类之之间还是是对象之象之间的关系,的关系,可分可分为:类模式模式:处理理类和子和子类之之间的关系,的关系,这些关系通些关系通过继承建立,在承建立,在编 译时刻就被确定下来,是属于静刻就被确定下
27、来,是属于静态的的对象模式象模式:处理理对象象间的关系,在运行的关系,在运行时变化,更具有化,更具有动态性性33设计模式的分模式的分类从某种意从某种意义上上说,几乎所有模式都使用,几乎所有模式都使用继承机制,所以承机制,所以类模式只指那些集中于模式只指那些集中于处理理类间关系的模式,而大部分模式关系的模式,而大部分模式都属于都属于对象模式的范畴象模式的范畴创建型建型类模式模式 将将对象的部分象的部分创建工作延建工作延迟到子到子类创建型建型对象模式象模式 则将它延将它延迟到另一个到另一个对象中象中结构型构型类模式模式 使用使用继承机制来承机制来组合合类结构型构型对象模式象模式 则描述了描述了对象
28、的象的组装方式装方式行行为型型类模式模式 使用使用继承描述算法和控制流承描述算法和控制流行行为型型对象模式象模式 则描述一描述一组对象怎象怎样协作完成作完成单个个对象所无法象所无法 完成的任完成的任务34设计模式的分模式的分类35目的创建型结构型行为型范围类Factory MethodFactory MethodAdapter(Adapter(类) )InterpreterInterpreterTemplate MethodTemplate Method对象Abstract FactoryAbstract FactoryBuilderBuilderPrototypePrototypeSingl
29、etonSingletonAdapter(Adapter(对象象) )BridgeBridgeCompositeCompositeDecoratorDecoratorFacadeFacadeFlyweightFlyweightProxyProxyChain of ResponsibilityChain of ResponsibilityCommandCommandIteratorIteratorMediatorMediatorMementoMementoObserverObserverStateStateStrategyStrategyVisitorVisitor创建型建型设计模式示例模式示例
30、36u工厂方法(Factory Method):父类负责定义创建对象的公共接口,而子类则负责生成具体对象,将类的实例化操作延迟到子类中完成u抽象工厂(Abstract Factory):为一个产品族提供统一的创建接口。当需要这个产品族的某一系列的时候,可以从抽象工厂中选出相应的系列创建一个具体的工厂类u单件(Singleton):保证一个类有且仅有一个实例,提供一个全局访问点u生成器(Builder):将复杂对象创建与表示分离,同样的创建过程可创建不同的表示。允许用户通过指定复杂对象类型和内容来创建对象,用户不需要知道对象内部的具体构建细节结构型构型设计模式示例模式示例37u组合(Compos
31、ite):定义一个接口,使之用于单一对象,也可以应用于多个单一对象组成的对象组u装饰(Decorator):给对象动态添加额外的职责,就好像给一个物体加上装饰物,完善其功能u代理(Proxy):在软件系统中,有些对象有时候由于跨越网络或者其他障碍,而不能够或者不想直接访问另一个对象,直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切u外观(Facade):为子系统提供了一个更高层次、更简单的接口,从而降低了子系统的复杂度,使子系统更易于使用和管理。外观承担了子系统中类交互的责任u桥梁(Bridge):桥梁模式的用意是将问题的抽
32、象和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题行行为型型设计模式示例模式示例38u观察者(Observer):定义了对象之间一对多的依赖,当这个对象的状态发生改变的时候,多个对象会接受到通知,有机会做出反馈u命令(Command):将请求及其参数封装成一个对象,作为命令发起者和接收者的中介,可以对这些请求排队或记录请求日志,以及支持可撤销操作u策略(Strategy):定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化u模版(Template ) :定义了一个算法步骤,并允许子类为一个或多个步骤提供实现。子
33、类在不改变算法架构的情况下,可重新定义算法中某些步骤u迭代子(Iterator):提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示设计模式与模式与软件体系件体系结构构39设计模式、框架、体系模式、框架、体系结构构框架不等同于体系框架不等同于体系结构构 体系体系结构确定了构确定了软件系件系统整体整体结构、构、层次划分,不同次划分,不同部分之部分之间的的协作等作等设计考考虑;而框架比体系;而框架比体系结构更具体,构更具体,更偏重于技更偏重于技术。确定框架后,。确定框架后,软件体系件体系结构也随之确定,构也随之确定,而而对于同一体系于同一体系结构(如构(如B/S架构),可以
34、通架构),可以通过多种框多种框架(架(SSH等)来等)来实现体系体系结构和构和设计模式通常出模式通常出现在在软件件设计的不同的不同阶段段 软件架构通常出件架构通常出现在在软件概要件概要设计的早期;而的早期;而单个个设计模式不能完成一个完整的模式不能完成一个完整的软件体系件体系结构的构的详细构造,故构造,故通常用在通常用在软件件详细设计阶段段40设计模式、框架、体系模式、框架、体系结构构设计模式和框架在模式和框架在软件件设计中是两种不同的研究中是两种不同的研究 框架框架给出的是整个出的是整个应用的体系用的体系结构,而构,而设计模式模式则给出出单一一设计问题的解决方案,并且的解决方案,并且这个方案
35、可在不同的个方案可在不同的应用程序或者框架中用程序或者框架中进行行应用;用; 构件通常是代构件通常是代码重用,而重用,而设计模式是模式是设计重用(重用(这个个设计可被不同可被不同语言以不用方式来言以不用方式来实现),框架),框架则介于两者介于两者之之间,部分代,部分代码重用,部分重用,部分设计重用重用41 设计模式的指模式的指导原原则 (面向(面向对象的象的设计原原则)在不改在不改在不改在不改变软变软件件件件现现有功能的基有功能的基有功能的基有功能的基础础上,通上,通上,通上,通过调过调整程整程整程整程序代序代序代序代码码改善改善改善改善软软件的件的件的件的质质量和性能,使程序的量和性能,使程
36、序的量和性能,使程序的量和性能,使程序的设计设计模式和架构更模式和架构更模式和架构更模式和架构更趋趋合理,提高合理,提高合理,提高合理,提高软软件的可件的可件的可件的可维护维护性和性和性和性和可重用性可重用性可重用性可重用性 重构重构重构重构(Refactoring)(Refactoring)42设计模式的七大原模式的七大原则43设计原则名称设计原则简介重要性单一职责原则 (SRP)类的职责要单一,不能将太多的职责放在一个类中,尽量做到松耦合开闭原则 (OCP)对扩展是开放的,对修改是关闭的,即在不修改已有程序代码的基础上去扩展其功能里氏代换原则 (LSP)在软件系统中,一个可以接受基类对象的
37、地方必然可以接受一个子类对象依赖倒转原则 (DIP)要针对抽象层编程,而不要针对具体类编程接口隔离原则 (ISP)使用多个专门的接口来取代一个统一的接口 合成复用原则 (CRP)在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系迪米特法则 (LoD)如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互单一一职责原原则一个一个对象象应该只包含只包含单一的一的职责,并且,并且该职责被完整地封被完整地封装在一个装在一个类中,如果一个中,如果一个类(或者大到模(或者大到模块,小到方法),小到方法)承担的承担的职责越多,就相当于将越多
38、,就相当于将这些些职责功能耦合在一起,功能耦合在一起,那么它被复用的可能性就越小那么它被复用的可能性就越小类的的职责主要包括两个方面:数据主要包括两个方面:数据职责和行和行为职责,数据,数据职责通通过其属性来体其属性来体现,而行,而行为职责通通过其方法来体其方法来体现单一一职责原原则是是实现高内聚、低耦合的指高内聚、低耦合的指导方方针,它是最,它是最简单但又最但又最难运用的原运用的原则,需要,需要设计人人员具有具有较强的分析的分析设计能力和相关重构能力和相关重构经验,以分离,以分离类的不同的不同职责44单一一职责原原则 示例示例45开开闭原原则软件研件研发过程中可以程中可以对其其进行功能行功能
39、扩展展(开放开放),但并不,但并不需要需要对原来已有代原来已有代码进行修改行修改(关关闭),即通,即通过不断不断扩展新展新模模块满足足变化的新需求,使化的新需求,使软件系件系统在在拥有适有适应性和性和扩展展性的同性的同时具有具有较好的好的稳定性和延定性和延续性性u实现的主要原的主要原则u 抽象原抽象原则:利用接口、抽象利用接口、抽象类等机制定等机制定义抽象抽象层,扩展功能展功能时并并不改不改动抽象抽象层,只需要增加新的具体,只需要增加新的具体类来来实现新功能新功能u 可可变性封装原性封装原则(Principle of Encapsulation of Variation, EVP) :对系系统
40、所有可能所有可能发生生变化的部分化的部分进行行评估和估和分分类,每一个可,每一个可变的因素都的因素都单独独进行封装行封装46开开闭原原则 示例示例47某某图形界面系形界面系统提供了各种不同形状的按提供了各种不同形状的按钮,客,客户端代端代码可可针对这些按些按钮进行行编程,用程,用户可能会改可能会改变需求要求使用需求要求使用不同的按不同的按钮,如使用菱形按,如使用菱形按钮,怎么,怎么办?里氏替里氏替换原原则是是实现开开闭原原则的重要方式之一的重要方式之一如果能如果能够使用基使用基类对象,那么一定能象,那么一定能够使用其子使用其子类对象。象。把基把基类都替都替换成它的子成它的子类,程序将不会,程序
41、将不会产生任何生任何错误和异和异常,反常,反过来来则不一定成立不一定成立基基类被真正复用,派生被真正复用,派生类能能够在基在基类的基的基础上增加新的行上增加新的行为;在程序中尽量使用基;在程序中尽量使用基类类型来型来对对象象进行定行定义,而在,而在运行运行时再确定其子再确定其子类类型,用子型,用子类对象来替象来替换父父类对象象48里氏替里氏替换原原则 示例示例49对重要数据的加密重要数据的加密处理,在理,在DataOperator 类中中调用加用加密密类(CipherA和和CipherB)中中实现的不同加密算法,如的不同加密算法,如果更果更换或增加一个加密算法或增加一个加密算法类时怎么怎么办?
42、依依赖倒倒转原原则针对接口接口编程,不要程,不要针对实现编程程 类的抽象耦合的抽象耦合代代码要依要依赖于抽象的于抽象的类,而不要依,而不要依赖于具体的于具体的类在程序代在程序代码中中传递参数参数时或在或在组合聚合关系中,尽量引合聚合关系中,尽量引用用层次高的抽象次高的抽象类,也就是,也就是使用抽象使用抽象类或接口或接口进行行变量量类型声明、参数型声明、参数类型声明、方法返回型声明、方法返回类型声明、数据型声明、数据类型的型的转换等等,而不用具体的,而不用具体的类来来实现这些事情些事情里氏替里氏替换原原则是依是依赖倒倒转原原则的基的基础(一个具体(一个具体类应该只只实现抽象抽象类中声明中声明过的
43、方法,否的方法,否则将无法将无法调用在子用在子类中增加的新方法),而中增加的新方法),而这两者都是开两者都是开闭原原则的一种具体的一种具体实现方法方法50依依赖倒倒转原原则 示例示例51系系统提供一个数据提供一个数据转换模模块,可以将来自不同数据源(数,可以将来自不同数据源(数据据库、文本等)的数据、文本等)的数据转换成不同的成不同的显示格式(示格式(XML、XLS),那么,增加新数据源或新),那么,增加新数据源或新显示格式怎么示格式怎么办?接口隔离原接口隔离原则多个和客多个和客户相关的接口要好于一个通用接口相关的接口要好于一个通用接口如果一个如果一个类有几个使用者,与其有几个使用者,与其让这
44、个个类载入所有使用者入所有使用者需要使用的所有方法,需要使用的所有方法,还不如不如为不同的使用者提供不同的使用者提供宽窄不窄不同的接口,同的接口,让该类分分别实现这些接口,些接口,为不同使用者提供不同使用者提供其所需的具体方法行其所需的具体方法行为使用接口隔离原使用接口隔离原则拆分接口拆分接口时,首先必,首先必须满足足单一一职责原原则,将一,将一组相关的操作定相关的操作定义在一个接口中,且在在一个接口中,且在满足高内足高内聚的前提下,接口中的方法越少越好聚的前提下,接口中的方法越少越好52接口隔离原接口隔离原则 示例示例53有多个客有多个客户类的系的系统,定,定义一个一个AbstractSer
45、vice胖接胖接口来服口来服务所有的客所有的客户类,那么,那么,ClientA能看到不相干的能看到不相干的operatorB和和operatorC方法,封装性差怎么方法,封装性差怎么办?合成复用原合成复用原则尽量使用尽量使用对象象组合,而不是合,而不是继承来达到复用的目的承来达到复用的目的在一个新的在一个新的对象里通象里通过关关联关系(包括关系(包括组合关系和聚合合关系和聚合关系)来使用一些已有的关系)来使用一些已有的对象,使之成象,使之成为新新对象的一部象的一部分;新分;新对象通象通过委派委派调用已有用已有对象的方法达到复用其已象的方法达到复用其已有功能的目的有功能的目的54继承的承的优缺点
46、缺点1. 新的新的实现很容易,因很容易,因为大部分是大部分是继承而来的承而来的 2. 很容易修改和很容易修改和扩展已有的展已有的实现1. 打破了封装,因打破了封装,因为基基类向子向子类暴露了暴露了实现细节 2. 白盒重用白盒重用,因,因为基基类的内部的内部细节通常通常对子子类可可见 3. 当父当父类的的实现改改变时可能要相可能要相应的的对子子类做出改做出改变 4. 不能在运行不能在运行时改改变由父由父类继承来的承来的实现55组合的合的优缺点缺点1. 被包含被包含对象通象通过包含他包含他们的的类来来访问 2. 黑盒重用黑盒重用,因,因为被包含被包含对象的内部象的内部细节是不可是不可见的的3. 很
47、好的封装,每个很好的封装,每个类专注于一个任注于一个任务 4. 通通过获得和被包含得和被包含对象的象的类型相同的型相同的对象引用,可象引用,可以在运行以在运行时动态定定义组合的方式合的方式1. 结果系果系统可能会包含更多的可能会包含更多的对象象 2. 为了使了使组合合时可以使用不同的可以使用不同的对象,必象,必须小心的小心的 定定义接口接口56合成复用原合成复用原则 示例示例57如果需要更如果需要更换数据数据库连接方式,如接方式,如JDBC改改为连接池,接池,则需要修改需要修改DBUtil类源代源代码。如果。如果StudentDAO采用采用JDBC连接,但是接,但是TeacherDAO采用采用
48、连接池接池连接,接,则需需要修改大量源要修改大量源码,违背开背开闭原原则,系,系统扩展性展性较差差迪米特法迪米特法则简单地地说,迪米特法,迪米特法则就是指一个就是指一个软件件实体体应当尽可能少当尽可能少的与其他的与其他实体体发生相互作用。生相互作用。这样,当一个模,当一个模块修改修改时,就会尽量少的影响其他的模就会尽量少的影响其他的模块,扩展会相展会相对容易,容易,这是是对软件件实体之体之间通信的限制通信的限制如果两个如果两个类之之间不必彼此直接通信,那么不必彼此直接通信,那么这两个两个类就不就不应当当发生直接的相互作用,如果其中的一个生直接的相互作用,如果其中的一个类需要需要调用另一用另一个
49、个类的某一个方法的的某一个方法的话,可以通,可以通过第三者第三者转发这个个调用用降低降低类之之间的耦合,但是会在系的耦合,但是会在系统中增加大量的小方法并中增加大量的小方法并散落在系散落在系统的各个角落,造成系的各个角落,造成系统的不同模的不同模块之之间的通信的通信效率降低效率降低58迪米特法迪米特法则 示例示例59某系某系统界面界面类(如如Form1、Form2等等类)与数据与数据访问类(如如DAO1、DAO2等等类)之之间的的调用关系用关系较为复复杂,怎,怎么么调整会整会满足迪米特法足迪米特法则?设计模式的使用方式模式的使用方式60设计模式的模式的选择 具体具体问题具体分析具体分析61考考
50、虑设计模式是怎模式是怎样解决解决设计问题的的浏览模式的意模式的意图部分部分研究模式怎研究模式怎样相互关相互关联研究目的相似的模式研究目的相似的模式检查重新重新设计的原因的原因考考虑你的你的设计中哪些是可中哪些是可变的的设计模式的使用模式的使用 循序循序渐进62大致大致浏览一遍一遍设计模式的描述,特模式的描述,特别注意适用性和效果注意适用性和效果部分的部分的说明,确定它适合你的明,确定它适合你的问题研究模式的研究模式的结构部分、参与者部分和构部分、参与者部分和协作部分作部分研究代研究代码示例部分,看看示例部分,看看这个模式代个模式代码形式的具体例子形式的具体例子选择模式参与者的名字,使其在模式参
51、与者的名字,使其在应用上下文中有意用上下文中有意义定定义类定定义模式中模式中专用于用于应用的操作名称用的操作名称实现执行模式中行模式中责任和任和协作的操作作的操作合理使用合理使用设计模式模式(1/3)63不是不是软件的任何部分都需要套用模式来件的任何部分都需要套用模式来设计的,必的,必须针对具体具体问题合理的使用模式合理的使用模式1、正确使用、正确使用当当设计软件系件系统,并确,并确认所遇到的所遇到的问题刚好适合使用某个模式,好适合使用某个模式,就可以考就可以考虑使用使用该模式到你的系模式到你的系统设计中,能使中,能使设计的系的系统易易维护、可、可扩展性展性强、复用性好,而且容易、复用性好,而
52、且容易让其他开其他开发人人员了解你的了解你的系系统和和设计思想思想2、避免教条、避免教条设计模式不是数学公式、物理定律、更不是模式不是数学公式、物理定律、更不是软件件设计中的法律条中的法律条文,一个模式只是成功解决某个特定文,一个模式只是成功解决某个特定问题的的设计方案,你完全可方案,你完全可以修改模式中的部分以修改模式中的部分结构以符合你的构以符合你的设计要求要求合理使用合理使用设计模式模式(2/3)643、模式挖掘、模式挖掘模式不是用理模式不是用理论推推导出来的,而是从真出来的,而是从真实世界的世界的软件系件系统中被中被发现、按着一定、按着一定规范范总结出来的可以被复用的方案。出来的可以被
53、复用的方案。许多文献或多文献或书籍里籍里阐述的众多模式述的众多模式实际上都是上都是GOF书中中经典模式的典模式的变形,可以形,可以从从领域系域系统中中总结出新模式(出新模式(经过“rule of three”认可)可)4、避免乱用、避免乱用不是所有的不是所有的设计中都需要使用模式,一个中都需要使用模式,一个设计中,可能并不需要中,可能并不需要使用模式就可以很好地使用模式就可以很好地满足系足系统的要求,如果的要求,如果牵强地使用某个模地使用某个模式可能会在系式可能会在系统中增加中增加许多多额外的外的类和和对象,影响系象,影响系统的性能,的性能,因因为大部分大部分设计模式往往会在系模式往往会在系统
54、中加入更多的中加入更多的层,这不但增加不但增加复复杂性,而且系性,而且系统的效率也会下降的效率也会下降合理使用合理使用设计模式模式(3/3)655、了解反模式、了解反模式反模式就是从某些反模式就是从某些软件系件系统中中总结出的不好的出的不好的设计方案,反模式方案,反模式就是告就是告诉你如何采用一个不好的方案解决一个你如何采用一个不好的方案解决一个问题。既然是一个。既然是一个不好的方案,不好的方案,为何何还有可能被重复使用呢?有可能被重复使用呢?这是因是因为,这些不好些不好的方案表面上往往有很的方案表面上往往有很强的吸引力,人的吸引力,人们很很难一眼就一眼就发现它的弊它的弊端,因此,端,因此,发
55、现一个反模式也是非常有意一个反模式也是非常有意义的工作的工作在有了一定的在有了一定的设计模式的基模式的基础之后,你可以用搜索引擎之后,你可以用搜索引擎查找有关找有关反模式的信息,反模式的信息,这对于学于学习好好设计模式也是非常有帮助的模式也是非常有帮助的设计模式的重要性模式的重要性66设计模式的意模式的意义设计模式的目的不是模式的目的不是针对软件件设计和开和开发中的每个中的每个问题都都给出解决方案,而是出解决方案,而是针对某种特定某种特定环境中通常都会遇境中通常都会遇到的常到的常见问题给出可重用的一般化解决方案出可重用的一般化解决方案设计模式是从模式是从许多多优秀的秀的软件系件系统中中总结出的
56、成功的、出的成功的、能能够实现可可维护性复用的性复用的设计方案,使用方案,使用这些方案将避些方案将避免重复性工作,而且可以免重复性工作,而且可以设计出高出高质量的量的软件系件系统67设计模式的模式的优点点(1/2)设计模式模式融合了众多融合了众多专家的家的经验,并以一种,并以一种标准的形式准的形式供广大开供广大开发人人员所用,它提供了所用,它提供了一套通用的一套通用的设计词汇和和一种通用的一种通用的语言言,以方便使用不同,以方便使用不同编程程语言的开言的开发人人员之之间沟通和交流,沟通和交流,使得使得设计方案更加通俗易懂方案更加通俗易懂设计模式使人模式使人们可以更加可以更加简单方便地复用成功的
57、方便地复用成功的设计,将已将已证实的技的技术表述成表述成设计模式也会使新系模式也会使新系统开开发者更者更加容易理解其加容易理解其设计思路,思路,设计模式使得重用成功的模式使得重用成功的设计更加容易,并避免那些更加容易,并避免那些导致不可重用的致不可重用的设计方案方案68设计模式的模式的优点点(2/2)设计模式使得模式使得设计方案更加灵活,且易于修改方案更加灵活,且易于修改设计模式将模式将提高提高软件系件系统的开的开发效率和效率和软件件质量量,且在,且在一定程度上一定程度上节约设计成本成本设计模式模式有助于初学者更深入地理解面向有助于初学者更深入地理解面向对象思想象思想,一,一方面可以帮助初学者更加方便地方面可以帮助初学者更加方便地阅读和学和学习现有有类库与与其他系其他系统中的源代中的源代码,另一方面,另一方面还可以提高可以提高软件的件的设计水平和代水平和代码质量量69课程后程后续安排安排课堂堂讲授内容:授内容:单件模式(件模式(Singleton)GRASP模式模式学生学生实践内容:践内容:2-3人一人一组,对 18 20 个个设计模式模式进行学行学习每次一个每次一个组进行行1学学时的学的学习成果成果汇报要求:要求:讲明白一个模式(明白一个模式(辅以例子、小程序等)以例子、小程序等)70