避免请求发送者与接收者耦合在一期,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它们为止。
类型:对象行为型模式。
角色:
Handler 抽象处理者(核心)ConcreteHandler 具体处理者职责链模式并不创建职责链,职责链的创建工作必须有系统的其他部分来完成,一般是在使用该职责链的客户端中创建职责链。
纯职责链和不纯职责链
一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中,要求一个请求必须被某一个处理者对象所接收,不能出现某个请求未被任何一个处理者对象处理的情况。
在一个不纯的职责链模式中允许某个请求被一个具体处理者部分处理后再向下传递,或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求,而且一个请求可以最终不被任何处理者对象所接收。
ex:采购单审批流程
优点:
客户端创建职责链,降低了系统耦合度。请求处理对象仅需维持一个指向其后继者的引用。缺点:
由于没有明确请求的接收者,有可能请求直到最后都没有被处理。职责链较长时,会增加代码条码的复杂度。定义:将一个请求封装为一个对象,从而让我们可用不用的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
类型:对象行为型模式。
角色:
Command 抽象命令类(核心)ConcreteCommand 具体命令类Invoker 调用者Receiver 接收者ex:计算器功能、网站配置文件管理工具
优点:
降低系统耦合度容易扩展缺点:
增加了系统代码理解复杂度,加大了代码维护难度。用于描述如何使用面向对象语言构成一个简单的语言解释器。
定义一个语言的文法,并且建立一个解释器来解释改语言中的句子,这里的“语言”指使用规定格式和语言的代码。
类型:类行为型模式。
表达式可分为终结符表达式和非终结符表达式。
角色:
AbstractExpression 抽象表达式TerminalExpression 终结符表达式NonterminalExpression 非终结符表达式Context 环境类在解释器模式中,每一种终结符和非终结符都有一个具体类与之对应。
ex:机器人控制程序(前后左右,移动/快速移动距离指令)
优点:
易于扩展和改变语法每一个文法都有相对应的类缺点:
代码维护难度大提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示。
类型:对象行为型模式。
在该结构中,包含了聚合和迭代器两个层次结构。
角色:
Iterator 抽象迭代器ConcreteIterator 具体迭代器Aggregate 抽象聚合类ConcreteAggregate 具体聚合类ex:销售管理系统数据遍历
也可使用内部类实现迭代器。
优点:
可以定义多种遍历方式遍历对象由于使用了抽象层,易于扩展缺点:
增加了系统复杂度设计难度较大用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
类型:对象行为型模式。
角色:
Mediator 抽象中介者ConcreteMediator 具体中介者Colleague 抽象同事类ConcreteColleague 具体同事类中介者类作用:
中转作用(结构性)协调作用(行为性)ex:客户信息管理系统;添加组件(列表添加数据,下拉框添加数据)
中介者模式在事件驱动类,软件中应用较为广泛。特别是基于GUI(图形用户界面)的软件。
优点:
简化了对象间的交互,易于扩展。系统松耦合减少子类数量缺点:
系统中包含了大量同事之间的交互,导致代码复杂度增加,难以维护。在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,可以在以后将对象恢复到原先保存的状态。
类型:对象行为型模式。
角色:
Originator 原发器Memento 备忘录Caretaker 负责人ex:象棋“悔棋”、撤销操作
优点:
该模式提供了状态恢复的实现机制。实现了对信息的封装。缺点;
消耗资源大定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生变化时,其相关依赖对象皆得到通知,并被自动刷新。
类型:对象行为型模式。
实现对象间的联动。
发生改变的对象称为观察目标。
被通知的对象为观察者。
角色:
Subject 目标 (被观察对象)ConcreteSubject 具体目标Observer 观察者ConcreteObserver 具体观察者JDK的Java.until包中,提供了Observable类以及Observer接口,构成了JDK对观察者的支持。
ex:多人联机对战游戏
优点:
在观察者和观察目标之间建立了一个抽象的耦合。观察目标只需维持一个抽象观察者的集合。观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知。缺点:
如观察目标有多个观察者,通知到所有观察者所需时间可能会花费很多时间。定义:允许一个对象在其内部状态改变时,改变它的行为,对象看起来似乎修改了它的类。
类型:行为型模式。
角色:
Concent 环境类State 抽象状态类(核心)ConcreteState 具体状态类(核心)ex:银行存取款
优点:
将业务方法和状态转换代码分隔开。将所有与状态有关的行为都放在一个类,只需注入一个不同的状态对象,即可使环境对象获得不同的行为。定义:定义一系列算法雷,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。
类型:对象行为型模式。
角色:
Context 环境类Strategy 抽象策略类ConcreteStrategy 具体策略类环境类是使用算法的类。
ex:电影票打折。
优点:
该模式提供了一种替换继承关系的办法。该模式可以避免多重条件选择语句。缺点:
客户端必须知道所有的策略类。无法在客户端同时使用多个策略类。定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
该模式是一种基于继承的代码复用技术。类型:类行为型模式。
角色:
AbstractClass 抽象类ConcreteClass 具体子类钩子方法:返回值一般为True
ex:银行业务利息计算模块。
优点:
可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。缺点:
需要为每一个基本方法的不同实现提供一个子类。定义:提供一个作用于某对象结构中的各元素的操作表示,它使我们可以在不改变各元素的类的前提下。定义作用于这些元素的新操作。
类型:对象行为型模式。
角色:
Vistor 抽象访问者ConcreteVisitor 具体访问者Element 抽象元素ConcreteElement 具体元素ObjectStructure 对象结构ex:员工数据汇总模块。
优点:
添加新的访问很方便。将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个元素类中。缺点:
添加新的元素困难。