《20131218-面向对象课件-设计模式介绍.ppt》由会员分享,可在线阅读,更多相关《20131218-面向对象课件-设计模式介绍.ppt(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、设计模式概述设计模式的诞生与发展模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士A Pattern Language:Towns,Buildings,Construction253个建筑和城市规划模式模式Context(模式可适用的前提条件)Theme或Problem(在特定条件下要解决的目标问题)Solution(对目标问题求解过程中各种物理关系的记述)设计模式的诞生与发展Christopher Alexander设计模式的诞生与发展w模式的诞生与定义 Alexander给给出了关于模
2、式的出了关于模式的经经典定典定义义:每个模式都描:每个模式都描述了一个述了一个在我在我们们的的环环境中不断出境中不断出现现的的问题问题,然后描述了,然后描述了该问题该问题的的解决方案解决方案的核心,通的核心,通过这过这种方式,我种方式,我们们可以无可以无数次地重用那些已有的解决方案,无需再重复相同的工数次地重用那些已有的解决方案,无需再重复相同的工作。作。A pattern is a solution to a problem in a context 模式是在模式是在特定特定环环境境中中解决解决问题问题的一种的一种方案方案 设计模式的诞生与发展w软件模式 1990年,年,软软件工程界开始关注
3、件工程界开始关注Christopher Alexander等等在在这这一住宅、公共建筑与城市一住宅、公共建筑与城市规规划划领领域的重大突破,最早将域的重大突破,最早将该该模式的思想引入模式的思想引入软软件工程方法学的是件工程方法学的是1991-1992年以年以“四四人人组组(Gang of Four,GoF,分,分别别是是Erich Gamma,Richard Helm,Ralph Johnson和和John Vlissides)”自称自称的四位著名的四位著名软软件工程学者,他件工程学者,他们们在在1994年年归纳发归纳发表了表了23种种在在软软件开件开发发中使用中使用频频率率较较高的高的设计
4、设计模式,旨在模式,旨在用模式来用模式来统统一一沟通面向沟通面向对对象方法在分析、象方法在分析、设计设计和和实现间实现间的的鸿鸿沟沟。设计模式的诞生与发展Gang ofFour设计模式的诞生与发展Erich Gamma苏黎世大学计算机科学博士,是Eclipse、JUnit 等项目主要技术负责人之一。John Vlissides斯坦福大学计算机科学博士,原IBM研究员,于2005年11月24日因脑瘤去世,享年44岁。Ralph Johnson 墨尔本大学计算机科学博士,原IBM 研究员,现在波士顿顾问集团供职。Richard Helm康奈尔大学计算机科学博士,伊利诺伊大学教授。Gang of F
5、our设计模式的诞生与发展软件模式 软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认同的模式。软件模式可以认为是对软件开发这一特定“问题”的“解法”的某种统一表示,它和Alexander所描述的模式定义完全相同,即软件模式等于一定条件下的出现的问题以及解法。软件模式的基础结构由4个部分构成:问题描述、前提条件(环境或约束条件)、解法和效果。设计模式的诞生与发展软件模式设计模式的诞生与发展软件模式软件模式与具体的应用领域无关,在模式发现过程中需要遵循
6、大三律(Rule of Three),即只有经过三个以上不同类型(或不同领域)的系统的校验,一个解决方案才能从候选模式升格为模式。设计模式的诞生与发展设计模式的发展 1987年,Kent Beck和Ward Cunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式,在OOPSLA会议上发表了他们的成果。1990年,OOPSLA与ECOOP联合举办,Erich Gamma和Richard Helm等人开始讨论有关模式的话题(Bruce Anderson主持),“四人组”正式成立,并开始着手进行设计模式的分类整理工作。1991 年,OOPSLA,Bruce Anderson
7、主持了首次针对设计模式的研讨会。1992 年,OOPSLA,Anderson再度主持研讨会,模式已经逐渐成为人们讨论的话题。注:OOPSLA(Object-Oriented Programming,Systems,Languages&Applications,面向对象编程、系统、语言和应用大会),编程语言及软件工程国际顶级会议,2010年改为SPLASH-Systems,Programming,Languages and Applications:Software for Humanity 设计模式的诞生与发展设计模式的发展 1993年,Kent Beck 和 Grady Booch 赞助了第
8、一次关于设计模式的会议,这个设计模式研究组织发展成为著名的Hillside Group研究组。1994 年,由Hillside Group发起,在美国伊利诺伊州(Illinois)的Allerton Park召开了第1届关于面向对象模式的世界性会议,名为PLoP(Pattern Languages of Programs,编程语言模式会议),简称PLoP94。1995年,PLoP95 仍在伊利诺伊州的Allerton Park举行,“四人组”出版了设计模式:可复用面向对象软件的基础(Design Patterns:Elements of Reusable Object-Oriented Sof
9、tware)一书,本书成为1995年最抢手的面向对象书籍,也成为设计模式的经典书籍。设计模式的诞生与发展设计模式的发展 从1995年至今,设计模式在软件开发中得以广泛应用,在Sun的Java SE/Java EE平台和Microsoft的.net平台设计中就应用了大量的设计模式。诞生了越来越多的与设计模式相关的书籍和网站,设计模式也作为一门独立的课程或作为软件体系结构等课程的重要组成部分出现在国内外研究生和大学教育的课堂上。设计模式的定义与分类 设计模式的定义 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代
10、码、让代码更容易被他人理解、保证代码可靠性。设计模式的定义与分类设计模式的基本要素 设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面:模式名称(Pattern name)问题(Problem)解决方案(Solution)效果(Consequences)设计模式的定义与分类设计模式学习步骤 模式动机与定义 模式结构与分析 模式实例与解析 模式效果与应用 模式扩展 设计模式的定义与分类设计模式的分类根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavior
11、al)三种:创建型模式主要用于创建对象。结构型模式主要用于处理类或对象的组合。行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。设计模式的定义与分类设计模式的分类根据范围,即模式主要是用于处理类之间关系还是处理对象之间的关系,可分为类模式和对象模式两种:类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是属于静态的。对象模式处理对象间的关系,这些关系在运行时刻变化,更具动态性。GoF设计模式简介 范围范围目的目的创建型模式创建型模式结构型模式结构型模式行为型模式行为型模式类模式类模式工厂方法模式(类)适配器模式解释器模式模板方法模式对象模式对象模式抽象工厂模式建
12、造者模式原型模式单例模式(对象)适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式职责链模式命令模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式访问者模式GoF设计模式简介 w创建型模式抽象工厂模式抽象工厂模式(Abstract Factory)建造者模式建造者模式(Builder)工厂方法模式工厂方法模式(Factory Method)原型模式原型模式(Prototype)单单例模式例模式(Singleton)GoF设计模式简介 w结构型模式适配器模式适配器模式(Adapter)桥桥接模式接模式(Bridge)组组合模式合模式(Composite)装装饰饰模式模式(Dec
13、orator)外外观观模式模式(Facade)享元模式享元模式(Flyweight)代理模式代理模式(Proxy)GoF设计模式简介 w行为型模式职责链职责链模式模式(Chain of Responsibility)命令模式命令模式(Command)解解释释器模式器模式(Interpreter)迭代器模式迭代器模式(Iterator)中介者模式中介者模式(Mediator)备备忘忘录录模式模式(Memento)观观察者模式察者模式(Observer)状状态态模式模式(State)策略模式策略模式(Strategy)模板方法模式模板方法模式(Template Method)访问访问者模式者模式(
14、Visitor)设计模式的优点 设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将避免我们做一些重复性的工作,而且可以设计出高质量的软件系统。设计模式的主要优点如下:设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。对于使用不同编程语言的开发和设计人员可以通过设计模式来交流系统设计方案,每一个模式都对应一个标准的解决方案,设计模式可以降低开发人员理解系统的复杂度。设计模式的优点 设计模式使人们可以更加简单方便地复用成功的设计和体系结构,
15、将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。设计模式使得设计方案更加灵活,且易于修改。设计模式的使用将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本。设计模式有助于初学者更深入地理解面向对象思想,一方面可以帮助初学者更加方便地阅读和学习现有类库与其他系统中的源代码,另一方面还可以提高软件的设计水平和代码质量。简单工厂模式创建型模式创建型模式概述创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清
16、晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。创建型模式创建型模式概述创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。创建型模式想吃苹果想吃苹果!?创建型模式概述创建型模式概述创建型模式获取苹果的两种方式获取苹果的两种方式自己种苹果树自己种苹果树去超市买去超市买创建型模式简单工厂模式(Simple Factory)工厂方法模式(Factory Method)抽象工厂模
17、式(Abstract Factory)建造者模式(Builder)原型模式(Prototype)单例模式(Singleton)w创建型模式简介简单工厂模式模式动机只需要知道水果的名字则可得到相应的水果简单工厂模式模式动机考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以
18、使用简单工厂模式。简单工厂模式模式定义简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式模式结构简单工厂模式模式结构简单工厂模式包含如下角色:Factory:工厂角色Product:抽象产品角色ConcreteProduct:具体产品角色简单工厂模式模式分析分析如下代码:public void pay(String type)if(type.eq
19、ualsIgnoreCase(cash)/现金支付处理代码 else if(type.equalsIgnoreCase(creditcard)/信用卡支付处理代码 else if(type.equalsIgnoreCase(voucher)/代金券支付处理代码 else 代码复杂,难以维护代码复杂,难以维护简单工厂模式模式分析重构后的代码:public abstract class AbstractPay public abstract void pay();public class CashPay extends AbstractPay public void pay()/现金支付处理代码
20、抽象支付类抽象支付类具体支付类具体支付类简单工厂模式模式分析重构后的代码:public class PayMethodFactory public static AbstractPay getPayMethod(String type)if(type.equalsIgnoreCase(cash)return new CashPay();/根据参数创建具体产品 else if(type.equalsIgnoreCase(creditcard)return new CreditcardPay();/根据参数创建具体产品 支付工厂支付工厂简单工厂模式模式分析将对象的创建和对象本身业务处理分离可以降低
21、系统的耦合度,使得两者修改起来都相对容易。在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何Java源代码。简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。简单工厂模式模式实例与解析实例:权限管理在某OA系统中,系统根据对比用户在登录时输入的账号和密码以及
22、在数据库中存储的账号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据库中的用户权限等级(以整数形式存储),根据不同的权限等级创建不同等级的用户对象,不同等级的用户对象拥有不同的操作权限。现使用简单工厂模式来设计该权限管理模块。简单工厂模式模式实例与解析实例:权限管理简单工厂模式课后:完成权限管理代码。简单工厂模式模式优缺点简单工厂模式的优点工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。客户端无须知道所创建的具体产品类的类名,只
23、需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。简单工厂模式模式优缺点简单工厂模式的缺点由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。简
24、单工厂模式模式适用环境在以下情况下可以使用简单工厂模式:工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。简单工厂模式模式应用(1)在JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间。public final static DateFormat getDateInstance();public final static DateFormat getDateI
25、nstance(int style);public final static DateFormat getDateInstance(int style,Locale locale);简单工厂模式模式扩展简单工厂模式的简化:在有些情况下工厂类可以由抽象产品角色扮演,一个抽象产品类同时也是子类的工厂,也就是说把静态工厂方法写到抽象产品类中。适配器模式结构型模式结构型模式概述 结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。结构型模式结构型模式概述结构型模式可以分为类结构型模式和对象结构
26、型模式:类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。结构型模式结构型模式简介 适配器模式(Adapter)桥接模式(Bridge)组合模式(Composite)装饰模式(Decorator)外观模式(Facade)享元模式(Flyweight)代理模式(Proxy)适配器模式模式动机适配器模式模式动机在软件开发中采用类似于电
27、源适配器的设计和编码技巧被称为适配器模式。通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。适配器模式模式动机在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。适配器
28、提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适配器模式的模式动机。适配器模式模式定义适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。适配器模式模式定义Adapter Pattern:Con
29、vert the interface of a class into another interface clients expect.Adapter lets classes work together that couldnt otherwise because of incompatible interfaces.Frequency of use:medium high 适配器模式模式结构类适配器适配器模式模式结构对象适配器适配器模式模式结构适配器模式包含如下角色:Target:目标抽象类Adapter:适配器类Adaptee:适配者类Client:客户类适配器模式模式分析典型的类适配器
30、代码:public class Adapter extends Adaptee implements Targetpublic void request()specificRequest();适配器模式模式分析典型的对象适配器代码:public class Adapter extends Targetprivate Adaptee adaptee;public Adapter(Adaptee adaptee)this.adaptee=adaptee;public void request()adaptee.specificRequest();适配器模式适配器模式实例与解析实例:加密适配器某系统
31、需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。适配器模式适配器模式实例与解析实例:加密适配器适配器模式模式优缺点适配器模式的优点将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。灵活性和扩展性都非常好,通过使用配置文
32、件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。适配器模式模式优缺点类适配器模式还具有如下优点:由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。类适配器模式的缺点如下:对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。适配器模式模式优缺点对象适配器模式还具有如下优点:一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都
33、适配到目标接口。对象适配器模式的缺点如下:与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。适配器模式模式适用环境在以下情况下可以使用适配器模式:系统需要使用现有的类,而这些类的接口不符合系统的需要。想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。适配器模式模式应用(1)Sun公司在1996年公开了Java语言的数据库连接工具JDBC,JDBC使得Java语言程序能够与数据库
34、连接,并使用SQL语言来查询和操作数据。JDBC给出一个客户端通用的抽象接口,每一个具体数据库引擎(如SQL Server、Oracle、MySQL等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件。抽象的JDBC接口和各个数据库引擎API之间都需要相应的适配器软件,这就是为各个不同数据库引擎准备的驱动程序。适配器模式模式应用(2)在Spring AOP框架中,对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型借助适配器模式来实现。public interface AdvisorAdapter /将一个Advisor适配成Met
35、hodInterceptor MethodInterceptor getInterceptor(Advisor advisor);/判断此适配器是否支持特定的Advice boolean supportsAdvice(Advice advice);适配器模式模式扩展默认适配器模式(Default Adapter Pattern)或缺省适配器模式当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。适配器模式模式
36、扩展默认适配器模式适配者接口 默认适配器类 具体业务类 适配器模式模式扩展默认适配器模式适配器模式模式扩展双向适配器 在对象适配器的使用过程中,如果在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么该适配器就是一个双向适配器。适配器模式模式扩展双向适配器 职责链模式行为型模式行为型模式概述 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例
37、对象之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。行为型模式行为型模式概述行为型模式分为类行为型模式和对象行为型模式两种:类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。行为型模式行为型模式简介 职责链模
38、式(Chain of Responsibility)命令模式(Command)解释器模式(Interpreter)迭代器模式(Iterator)中介者模式(Mediator)备忘录模式(Memento)观察者模式(Observer)状态模式(State)策略模式(Strategy)模板方法模式(Template Method)访问者模式(Visitor)职责链模式模式动机职责链模式模式动机职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者
39、对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。职责链模式模式定义职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为型模式。职责链模式模式定义Chain of Responsibility Pattern:Avoid coupling the sender of a r
40、equest to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.Frequency of use:medium low 职责链模式模式结构职责链模式模式结构职责链模式包含如下角色:Handler:抽象处理者ConcreteHandler:具体处理者Client:客户类职责链模式模式分析在职责链模式里,很多对象
41、由每一个对象对其下家的引用而连接起来形成一条链。请求在这条链上传递,直到链上的某一个对象处理此请求为止。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。职责链模式模式分析典型的抽象处理者代码:public abstract class Handlerprotected Handler successor;public void setSuccessor(Handler successor)this.successor=successor;public abstract void handleRequest(Strin
42、g request);职责链模式模式分析典型的具体处理者代码:public class ConcreteHandler extends Handlerpublic void handleRequest(String request)if(请求request满足条件)./处理请求;elsethis.successor.handleRequest(request);/转发请求转发请求 职责链模式职责链模式实例与解析实例:审批假条 某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天
43、,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。职责链模式职责链模式实例与解析实例:审批假条 职责链模式模式优缺点职责链模式的优点 降低耦合度 可简化对象的相互连接 增强给对象指派职责的灵活性 增加新的请求处理类很方便职责链模式模式优缺点职责链模式的缺点不能保证请求一定被接收。系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。职责链模式模式适用环境 在以下情况下可以使用职责链模式:有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。可动态指定一组对象处理请
44、求。职责链模式模式应用(1)Java中的异常处理机制try catch(ArrayIndexOutOfBoundsException e1)catch(ArithmeticException e2)catch(IOException e3)finally 职责链模式模式应用(2)早期的Java AWT事件模型(JDK 1.0及更早):事件浮升(Event Bubbling)机制。JavaScript事件浮升机制:职责链模式模式扩展纯与不纯的职责链模式一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:一个是承担责任,另一个是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。