设计模式.doc_第1页
设计模式.doc_第2页
设计模式.doc_第3页
设计模式.doc_第4页
设计模式.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1 设计模式创建型结构型行为型类Factory Method Adapter_Class InterpreterTemplate Method 对象Abstract FactoryBuilderPrototypeSingleton Adapter_ObjectBridgeCompositeDecoratorFacadeFlyweightProxy Chain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor 创建模式,结构模式,行为模式1.1 ok简单工厂模式simple factoryn 又叫静态工厂方法,是由一个工厂对象决定创建出哪一种产品类的实例。n 角色:工厂类、抽象产品、具体产品n 退化的简单工厂模式n 如果只有一个具体产品角色的话,可以省略掉抽象产品角色n 工厂角色可以由抽象产品角色扮演u java.text.DateFormat,一个抽象产品类同时是子类的工厂n 三个角色都可以合并,一个产品类就是自身的工厂n 优点:n 简单工厂模式实现了对责任的分割,客户端只管消费,工厂只管创建。客户端完全不需要知道返回的对象是怎么样创建的.n 缺点:n 新添加产品类必然导致工厂类的修改u 有限程度上支持开闭原则(要求一个系统的设计能够允许系统在无需修改的情况下扩展其功能)n 当具体的产品类有不同的接口种类时候.功能扩展较为困难n 每个工厂类可以有多个的工厂方法n 单例模式和多例模式是建立在简单工厂模式的基础上.而且他们要求,工厂方法具有特殊的逻辑,以便循环使用产品的实例n 单例模式使用了简单工厂模式单例类使用了静态工厂方法提供自身的实例n 单例模式和多例模式的共同点在于他们都禁止外界直接将之实例化n 将工厂方法的返回类型设置成抽象产品类型的做法叫针对抽象编程。是依赖倒转原则的应用1.2 ok工厂方法模式factory methodl 别名:虚拟构造子(virtual constructor)模式,多态性(polymorphic Factory)工厂模式l 用意:创建一个创建产品对象的工厂接口,将实际创建工作推迟到子类中l 简单工厂模式与工厂方法模式区别n 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态,工厂方法模式保持了简单工厂模式的优点,而且克服了他的缺点。n 工厂方法模式核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。n 工厂方法模式退化后变得很像简单工厂模式。l 角色n 抽象工厂角色n 具体工厂角色n 抽象产品角色n 具体产品角色l 优点n 允许系统在不修改具体工厂角色的情况下引入新的产品。l 工厂方法返还的应当是抽象类型,而不是具体类型。这有这样才能保证产品的多态性。l 举例n Collection接口的Iterator就是一个工厂方法。l 工厂方法模式和模板方法模式的关系n 工厂方法模式,经常和模版方法模式一起联合使用.n 模版方法本身也可能就是工厂方法模式1.3 ok抽象工厂模式Abstract factoryl 用意:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族的产品对象。l 抽象工厂模式与工厂方法模式最大的区别在于:n 工厂方法模式针对的是一个产品等级结构,抽象工厂模式则需要面对多个产品等级结构. n 一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。显然,这时候抽象工厂模式比工厂方法模式更有效率。n 抽象工厂模式是工厂方法模式的进一步推广l 涉及的角色n 抽象工厂角色n 具体工厂类角色n 抽象产品角色n 具体产品角色nl 以下情况应当考虑使用抽象工厂模式n 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂都是重要的。n 这个系统的产品有多于一个的产品族。而系统只消费其中某一族的产品。(这是抽象工厂模式的原始用意。)n 同属于同一个产品族的产品是在一起使用的。这一约束必须在系统设计中体现出来。n 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。l 对开闭原则的支持n 在系统的产品族增加时,抽象工厂模式支持开闭原则n 对于产品等级结构的增加,抽象工厂模式不支持开闭原则1.4 ok单例模式singletonu 单例模式确保某个类只有一个实例。而且自行实例化并向整个系统提供这个实例。u 单例模式的三个要点n 某个类只能有一个实例(单例对象持有自己的引用)n 它必须创建这个实例n 必须自行向整个系统提供这个实例u 一个最重要的特点是:构造方法是私有的.u 分类n 饿汉式n 懒汉式(静态工厂方法使用了同步)u 双重检查成例对java语言编译器不成立.?n 同步实际上只在成员变量第一次赋值之前才有效。在成员变量有了值之后,同步化实际上变成了不必要的瓶颈。n 在java编译器中,Test类的初始化与test变量赋值的顺序不可预料,如果一个线程在没有同步的条件下读取test,并调用这个对象的方法的话,可能会发现对象的初始化过程尚未完成。从而造成崩溃。n 很多非常聪明的人在这个成例的java版本上花费了非常多的时间,到现在为止,人们得出的结论是:一般而言,双重检查成例无法在现有的java语言编译器里面工作。n 使用饿汉式单例模式或者对整个静态工厂方法同步化 的懒汉式单例模式足以解决实际工作中遇到的问题。u 登记式单例类n 登记式单例类是为了克服饿汉式、懒汉式单例类均不可继承的缺点而设计的。n 由于子类必须允许父类以构造子方式调用产生实例。因此它的构造子必须是公开的。这样一来,就等于允许了以这样的方式产生实例而不在父类中等级。这是登记式单例类的缺点n 由于父类的实例必须存在,才可能有子类的实例。这在有些情况下是个浪费。u 使用单例模式的条件n 在一个系统中要求一个类只有一个实例时才应当使用单例模式。u 有状态的单例类与无状态的单例类n 在使用了EJB,RMI,JNI技术的分散式系统中。应该避免使用有状态的单例类。u 在同一个JVM,2个类加载器加载同一个类,会出现2个实例。除非系统有协调机制,不然在这种情况下,应该避免使用有状态的单例类。u java语言中的单例模式n public static Runtime getRuntime()u 在每一个java应用程序里面,都有唯一的一个Runtime对象。通过这个Runtime对象,应用程序可以与其运行环境发生相互作用。n public static Toolkit getDefaultToolkit()u 单例类使用了简单工厂模式(又称静态方法工厂模式)来提供自己的实例1.5 ok多例模式multitonl 多例模式是单例模式的自然推广。l 多例模式的特点n 多例类可有多个实例n 多例类必须自己创建,管理自己的实例,并向外界提供自己的实例。l 有上限多例模式n 一个实例数目有上限的多例类.n 例如掷骰子。n 上限为1时候就是单例类。单例类是多例类的特殊情况。n 数量少可以用静态成员变量管理多例,数量多可以用静态的容器来管理多例。l 无上限多例模式n 实例数目没有上限的多例模式叫做无上限多例模式l 有状态和没有状态的多例类n 如同单例类可以分为有状态和没有状态两种,多例类也可以分为有状态和没有状态两种。1.6 ok建造模式builderl 建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象l 角色:n 抽象建造者(如果非常肯定系统只需要一个具体建造者角色的话,可以省掉抽象建造者角色)n 具体建造者n 导演者(是与客户打交道的角色)n 产品l 建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造零件的责任分割开来,达到责任划分和分割的目的。l 模板方法设计模式和建造模式设计模式的区别n 退化的建造模式和模板方法有相似之处。n 如果系统要求发生变化,(有不同零件的生成逻辑),那么有两个选择,1,改回完全的建造模式。改造成模板方法设计模式。l javamail里的Message类就是一个退化的建造模式。l 什么时候用建造模式n 产品有复杂的内部结构。n 产品对象的属性相互依赖(有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义, 有些情况下,一个对象会有一些重要的性质,在他们没有恰当那个的值之前,对象不能作为一个完整的产品使用。(比如邮件)。n 在对象创建过程中,会使用到系统中的其他一些对象。这些对象在产品对象创建过程中不易得到。n 建造模式的使用使得产品的内部表象可以独立的变化。使用建造模式可以使客户端不必知道产品内部组成的细节。l1.7 原始模型prototype有个原型,每次都不是new出来的是克隆出来的这个方法用的很少.速度还不如new快呢.1.8 ok适配器模式Adapterl 也叫变压器模式l 也叫包装(wraper)模式l 适配器模式的用意:改变源的接口,以便与目标接口相容l 把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。ll 有两种,类的适配器模式,对象的适配器模式n 类的适配器模式把被适配的类的API转换成了目标类的API 。Adaptee和Adapater是继承的关系。这决定了这个适配器模式是类的。n 与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成了目标类的API。与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。Adapter和Adaptee是委派关系。决定了这个适配器模式的对象的。l 举例n iterator与enumeration的适配n Jdbc/odbc桥,就是适配器模式的具体应用.l 与装饰模式的关系n 装饰类不能改变他所装饰的对象的接口1.9 ok缺省适配模式Default Adapter缺省适配器模式为一个接口提供缺省实现,这样子类可以从这个缺省实现来继承,而不必从原有接口来进行扩展。适配器模式的用意是要改变源的接口,以便与目标类的接口相容。缺省适配器的用意稍有不同。它是为了方便建立一个不平庸的适配器类而提供的一种平庸的实现。缺省适配器类应当是抽象的,因为这个类不应当实例化,它的实例也没有什么用途。1.10 合成模式Composite讲到树状结构的时候再讲合成模式把部分何整体的关系用树状结构表示出来。文件系统是一个典型的合成模式两种方式:透明方式和安全方式安全方式:要求管理聚集的方法只出项在树枝构件类中。在AWT中,Button和Checkbox是树叶,Container是树枝。AWT中使用的是安全形式的合成模式。好处:客户端不用知道到底是树枝还是树叶。1.11 装饰模式Decorator不说他了.提到的时候再说不是很重要.装饰模式,常常被称作包裹模式,每一层包裹都提供了一些新的功能需要扩展一个类的功能,或者给一个类增加附加功能。,装饰模式与继承关系的目的都是扩展对象的功能。但是装饰模式可以提供比继承更多的灵活性装饰模式是java io 库的整体设计模式.装饰模式在java语言中的最著名的应用莫过于java io标准库的设计了.面向抽象编程。Component c = new ConcreteComponet();Component c1 = new ConcreteDecorator1(c);Component c2= new ConcreteDecorator2(c); 这样是不对的。ConcreteComponent c = new ConcreteDecorator()在使用java io库的时候,必须理解java io 库是由一些基本的原始流处理器和围绕他们的装饰流处理器组成的.这样,可以在学习和使用javaio库的时候做到事半功倍的效果.BufferedInputStream装饰了InputSteam的内部的工作方式.使得流的读入操作使用缓冲机制.不会对流的每一次读入操作都产生一个物理的读盘操作.LineNumberInputStream使得程序能够按照行号读入数据,(用java语言制作编译器)PushbackInputStream使得在读入过程中后退一个字符. (用java语言制作编译器?)装饰模式和适配器模式都是包裹模式 wrapper pattern1.12 ok代理模式Proxyl 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用l 适配器模式就是这种通信间接化思想的体现。l 装饰模式也是一个利用了中间对象来增强对象功能的模式l 代理有一下几种:n 远程代理n 虚拟代理n Copy On Write 代理n 保护代理n Cache代理n 防火墙代理n 同步化代理n 只能引用代理、l 在所有的代理模式中,虚拟代理,远程代理,只能引用代理,保护代理是最常见的代理模式。l 代理模式涉及的角色n 抽象主题角色Subjectn 代理主题角色ProxySubjectn 真实主题角色RealSubjectl 代理模式是怎样工作的:n 代理主题不改变主题接口,用户感觉不到代理的存在n 代理使用委派将客户端的调用委派给真实的主题对象u 换言之,代理起到传递请求的作用.n 代理可以在传递请求之前之后作一些操作.而不是单纯传递请求l 代理模式将一个中间层插入到客户端和主题角色之间,从而提供了许多的灵活性l 代理模式和适配器模式n 适配器模式改变对象的接口。而代理模式并不改变对象的接口,这一点上有明显的区别l 代理模式和装饰模式n 装饰模式与所装饰的对象具有相同的接口。n 装饰模式为所装饰的对象提供新的功能。而代理模式为对象的使用施加控制。并不提供对象本身的增强功能。l 代理模式和门面模式n 有时候,门面模式兼任代理的责任。这时候又叫代理门面模式。l 举例n java.lang.reflect.Proxy的使用n spring1.13 享元模式Flyweight用的很少.不管它享元模式:以共享的方式,高效的支持大量的细粒度对象.Java中,String类型就使用了享元模式.在JVM内部.String对象都是共享的.String对象是不变对象,一旦创建出来就不能改变.享元对象可以用不变模式来实现.单纯享元模式,复合享元模式.1.14 ok门面模式l 什么是门面模式n 外部与一个子系统的通信,必须通过一个统一的门面对象进行.这就是门面模式n 对一个子系统,通常只有一个门面类.并且只有一个门面类的实例n 通过继承一个门面类,而在子系统中增加行为,这是错误的.医院的接待员不能给病人提供新的按摩服务n 如果一个系统有好几个子系统,每个子系统可以有自己的一个门面类。nl 门面模式举例:n 医院n 政府办事机关。l 好处n 将客户端和系统内部的复杂性分开,客户端只需要和门面对象打交道。而不需要和子系统内部的对象打交道。l 角色n 门面n 子系统l 在什么情况下使用门面类?n 为一个复杂子系统提供一个简单的客户端调用的接口n 获得子系统的独立性和可移植性。n 简化子系统的层次化结构l Session 门面模式,是J2EE模式的一种.实际上也是门面模式在j2ee框架中的应用1.15 桥梁模式不常用JDBC驱动器.DriverManager,桥梁模式的例子耦合,就是两个实体的行为的某种强关联强关联,就是编译时已经确定的,无法在运行期动态改变的关联弱关联,可以动态的确定,并且可以在运行期间,动态的改变的关联.在java语言中,继承是强关联.聚合关系是弱关联AWT中,每一个Component子类都有一个ComponentPeer子类与之对应.所有Component子类都属于一个等级结构,所有ComponentPeer子类都属于另外一个登记结构.Component类型,和ComponentPeer类型,都通过Toolkit对象相互通信.Component相当于抽象角色.Button相当于修正抽象角色.ComponentPeer相当于实现化角色,而ButtonPeer相当于具体实现化角色.Java的AWT就是这样实现”Write once,run anywhere”Toolkit使用了抽象工厂模式创建各种Peer对象.大多数Driver都是桥梁模式的应用重构:不增加不减少系统功能的前提下,对代码的结构进行优化JDBC/ODBC桥不是桥梁模式,是适配器模式1.16 不变模式不变模式最著名的应用就是Sring分为两种,一种是弱不变模式,(这个类的子类的实例具有可能会变化的状态)一种是强不变模式.(子类的实例也具有不可变的状态)不变属性和只读属性的区别如果程序处理的字符串,有频繁的内容变化时候,就不宜使用String类.而应该使用StringBuffer.如果需要对字符串做大量循环查询,也不宜使用String,而应考虑byte 或者char.String实际上是一个封装类.因为它封装了一个char数组private final char value;存在vector里面的必须是对象.而不可以是原始类型.Long根本没有提供修改内部值的方法.Long的静态方法,parseLong,并没有修改自身的状态,而是返回了一个新的Long对象享元模式中,大部分享元是不变对象,但享元不一定非得是不变对象不可1.17 ok策略模式strategyl 用意:n 针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化l 解释n 用一句话来说就是:准备一组算法,并将每一组算法封装起来,使得他们可以互换。n 策略模式相当于可插入的算法n 策略模式是对算法的包装. 是把使用算法的责任和算法本身分隔开。委派给不同的对象管理。n 策略模式又称政策模式。n 客户端决定什么情况下使用什么策略n 这个模式涉及到三个角色:u 环境角色Contextu 抽象策略角色Strategy 可以是接口可以是抽象类u 具体策略角色ConcreteStrategyl 使用策略模式的例子:n AWT的LayoutManager,使用了策略模式l 在什么情况下使用策略模式n 多个算法选择其一n 算法使用的数据不需要用户知道。l 在什么情况下不使用策略模式n 策略模式不适合处理同时嵌套多于一个算法的情形,这时,应该用装饰模式u 在所有的折扣算法计算后,总的折扣恕不能超过1000元。l 优点n 策略模式把环境和行为分割开来,环境负责维持和查询行为类,各种算法则在具体策略类提供,由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。n 由于具体策略角色可以继承抽象策略角色,达到代码重用的目的。n 避免环境角色端使用继承关系。n 避免使用多重条件转化语句,比使用继承更原始落后l 缺点n 客户端必须之道所有的算法是怎么回事n 需要想办法控制对象的数量。l 举例n 商场打折l 和其他的设计模式的关系n 策略模式和建造模式的关系n 和适配器模式的关系n 和享元模式的关系n 和模板方法模式的关系n 和MVC模式的关系n 和装饰模式的关系1.18 ok模版方法模式准备一个抽象类,将部分逻辑以具体方法及具体构造方法的形式实现,然后声明一些抽象方法,来迫使子类实现剩余的逻辑,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模版方法方式的用意模板方法是基于继承的代码复用的基本技术。代表具体逻辑步骤的方法称作基本方法。而将这些基本方法汇总起来的方法叫模板方法。此模式鼓励恰当的使用继承HttpServlet类的service方法,典型的模版方法模式模板方法模式中的基本方法都是留给子类实现的。他们的名字应该以do开始。1.19 ok观察者模式Observer又叫发布-订阅模式、模型-视图模式、源-监听器模式、从属者模式观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化的时候,会通知所有观察者对象,使他们自动更新自己.Java1.1以后,awt事件处理机制,建立在观察者模式基础上的.因此,观察者模式在java语言中的地位较为重要。有两种实现方式。第二种方式与第一种方式的区别:代表存储观察者对象的聚集连线是从抽象主题到抽象观察者。第二种方案与java语言给出的对观察者模式的支持完全一致。java.util.Observerjava.util.Observable被观察者类都是java.util.Observable的子类底层事件和语义事件语义事件:ActionEvent(单击按键,选择菜单项,选择列表项,在文字框中输入文字),AdjustmentEvent(调整滚动条),ItemEvent(用户在一组选择框中选择了一个,或者在列表中选择一项),TextEvent(文字框的内容有变化)底层事件:ComponentEvent,KeyEvent,MouseEvent,FoucusEvent,WindowEvent,ContainerEvent1.20 ok迭代子模式l 迭代子模式又叫游标模式l 迭代子模式可以顺序的访问一个容器中的元素而不必暴露容器的内部表象。l JCF中广泛使用迭代子来遍历容器中的元素.l 角色n 抽象迭代子角色n 具体迭代子角色n 聚集角色n 具体聚集角色n 客户端l 宽接口和窄接口n 宽接口:一个聚集的接口提供了可以用来修改聚集元素的方法n 窄接口:一个聚集的接口没有提供可以用来修改聚集元素的方法l 白箱聚集与外稟迭代子n 提供宽接口的聚集叫白箱聚集n 由于迭代子是在聚集的结构之外的,因此这样的迭代子又叫外稟迭代子n 在这种实现中,迭代子角色是一个外部类。而具体聚集角色向外界提供遍历聚集元素的接口n 迭代子模式要求聚集对象必须有一个工厂方法,也就是createIterator方法,向外界提供迭代子对象的实例。l 黑箱聚集与内稟迭代子n 一个黑箱聚集不向外部提供遍历自己元素对象的接口。由于内稟迭代子恰好是聚集的内部类,因此,内稟迭代子对象是可以访问聚集的元素的。n 同时保证聚集对象的封装和迭代子功能的实现的方案叫黑箱实现方案。n 由于迭代子是在聚集的结构之内定义的,因此这样的迭代子又叫内稟迭代子l 游标迭代子n 由于聚集实现自己的迭代逻辑,并向外部提供适当的借口,使得迭代子可以从外部控制聚集元素的迭代过程,这样一来迭代子控制的仅仅是一个游标而已,这种迭代子游标迭代子。l 主动迭代子和被动迭代子n 使用主动迭代子的客户端会明显调用迭代子的next()等迭代方法。在遍历过程中向前进行n 而客户端在使用被动迭代子时,客户端并不明显的调用迭代方法,迭代子自动退经遍历过程。l 内稟与外稟n 使用外稟迭代子的一个重要理由是它可以被几个不同的方法和对象共同享用和控制。n 使用内稟迭代子的优点是不破坏聚集的封装。n AbstractList使用内稟迭代子,但同时这个类向外提供自己的遍历方法。也就是说客户端可以定义自己的外稟迭代子。l 静态迭代子和动态迭代子。n 静态迭代子将原聚集复制了一份。好处是安全简单。易于实现。不容易出错。短处是对时间和内存的消耗。n 动态迭代子保持对聚集元素的引用。完整的动态迭代子不容易实现。n 简化的动态迭代子。l fail-fastn 当一个算法开始之后,它的运算环境发生变化。使得算法无法进行必要的调整时,这种算法就应当立即发出故障信号。这就是fail-fast的含义。n 是一种出项错误时的早期警报功能。l 过滤迭代子n 在扫过聚集元素的同时进行计算。以确定呈现给客户端的元素都是满足某一个过滤条件的。或者这些元素已经经过了重新的排列。l 迭代子优点n 聚集类的设计简单,不必对外提供遍历api。n 一个聚集对象可以同时有几个迭代在进行中。n 客户端不必知道聚集的具体类型。就可以读取和遍历聚集对象。即使聚集对象的类型发生变化也不会影响客户端的遍历。l 迭代子缺点n 迭代子模式给客户端一个聚集被顺序化的错觉n 迭代子给出的聚集元素没有类型特征。(应用泛型可解决此问题)l 迭代子模式和工厂模式的关系。n 聚集角色一般提供一个工厂方法,向外界提供自己的迭代子对象。l Iterator与listIteratorn listIterator是Iterator的子接口。n Collection定义了iterator方法。AbstractList又添加了一个ListIterator方法。l Iterator与EnumerationEnumerationIteratorListIterator不能删除元素删除元素不能不能增加元素不能不能反向迭代不支持fail-fast支持fail-fast支持fail-fast1.21 ok责任连模式l 什么是责任链模式:n 系统中将会存在多个有类似处理能力的对象。当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的“责任”对象,并进行处理。n 责任链可能是一条直线,一个环链,或者一个数状结构的一部分。n 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。n 说白了就是 “推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。至于到底谁解决了这个问题了呢?我管呢!l 纯与不纯n 纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。不能出现处理了一部分,把剩下的传给了下家的情况。而且请求在责任链中必须被处理,而不能出现无果而终的结局。n 责任链模式的纯与不纯的区别,就像黑猫、白猫的区别一样。不要刻意的去使自己的代码来符合一个模式的公式。只要能够使代码降低耦合、提高重用,满足系统需求并能很好的适应变化就好了。正所谓:管它黑猫白猫,抓住老鼠就是好猫!n 反之,则就是不纯的责任链模式。n 不纯的责任链模式还算是责任链模式吗?比如一个请求被捕获后,每个具体处理者都尝试去处理它,不管结果如何都将请求再次转发。我认为这种方式的实现,算不算是责任链模式的一种倒不重要,重要的是我们也能从中体味到责任链模式的思想:通过将多个处理者之间建立联系,来达到请求与具体的某个处理者的解耦。n 责任链模式并不创建出责任链,责任链的创建必须由系统的其他部分创建出来。n 责任链模式要求在同一个时间里,命令只可以传给一个下家,而不可以传给多个下家。nl 角色n 抽象处理者,(通常由java抽象类或者接口来实现)n 具体处理者。l 例子n AWT1.0使用了责任链模式和命令模式来处理GUI事件。n 1.1版本以后,事件处理模型是建立在观察者模式的基础上,而不是建立在责任链模式基础上n 论坛关键词过滤l 适用范围:n 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。n 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请

温馨提示

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

评论

0/150

提交评论