设计模式-行为型

十4、责任链模式(Chain of Responsibility)

一、定义

使多个对象都有机会处理请求,避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象来处理它为止。算法

二、类图

Handler:定义职责的接口,一般在这里定义处理请求的方法,能够在这里实现后继链。bash

ConcreteHandler:实现职责的类,在这个类里面,实现对在它职责范围内请求的处理,若是不处理,就继续转发请求给后继者。spa

Client:职责链的客户端,向链上的具体处理者对象提交请求,让职责链负责处理。3d

三、调用顺序

四、示例代码

五、 什么时候选用职责链模式

一、若是有多个对象能够处理同一个请求,可是具体由哪一个对象来处理该请求,是运行时刻动态肯定的日志

二、若是你想在不明确指定接收者的状况下,向多个对象中的一个提交一个请求的话,可使用职责链模式code

三、若是想要动态指定处理一个请求的对象集合,可使用职责链模式,职责链模式能动态的构建职责链cdn

十5、策略模式(Strategy)

一、定义

定义一系列的算法,把它们一个个封装起来,而且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。server

二、类图

Strategy:策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。

ConcreteStrategy:具体的策略实现,也就是具体的算法实现。对象

Context:上下文,负责和具体的策略类交互,一般上下文会持有一个真正的策略实现,上下文还可让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。接口

三、调用顺序

四、示例代码

/**
 * 策略,定义算法的接口
 */
public interface Strategy {
    /**
     * 某个算法的接口,能够有传入参数,也能够有返回值
     */
    public void algorithmInterface();
}
复制代码
/**
 * 实现具体的算法
 */
public class ConcreteStrategyA implements Strategy {
    public void algorithmInterface() {
        //具体的算法实现   
    }
}
复制代码
/**
 * 实现具体的算法
 */
public class ConcreteStrategyB implements Strategy {
    public void algorithmInterface() {
        //具体的算法实现   
    }
}
复制代码

五、什么时候选用策略模式

一、出现有许多相关的类,仅仅是行为有差异的状况

二、出现同一个算法,有不少不一样的实现的状况

三、须要封装算法中,与算法相关的数据的状况

十6、模板方法模式(Template Method)

一、定义

定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤

二、类图

AbstractClass:抽象类。用来定义算法骨架和原语操做,具体的子类经过重定义这些原语操做来实现一个算法的各个步骤。在这个类里面,还能够提供算法中通用的实现。

ConcreteClass:具体实现类。用来实现算法骨架中的某些步骤,完成跟特定子类相关的功能。

三、示例代码

十7、命令模式(Command)

一、定义

将一个请求封装为一个对象,从而使你可用不一样的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操做。

二、类图

Command:定义命令的接口,声明执行的方法。

ConcreteCommand:命令接口实现对象,是“虚”的实现;一般会持有接收者,并调用接收者的功能来完成命令要执行的操做。

Receiver:接收者,真正执行命令的对象。任何类均可能成为一个接收者,只要它可以实现命令要求实现的相应功能。

Invoker:要求命令对象执行请求,一般会持有命令对象,能够持有不少的命令对象。这个是客户端真正触发命令并要求命令执行相应操做的地方,也就是说至关于使用命令对象的入口。

Client:建立具体的命令对象,而且设置命令对象的接收者。注意这个不是咱们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,由于真正使用命令的客户端是从Invoker来触发执行。

三、调用顺序

四、示例代码

真实示例

五、什么时候选用命令模式

一、若是须要抽象出须要执行的动做,并参数化这些对象,能够选用命令模式,把这些须要执行的动做抽象成为命令,而后实现命令的参数化配置

二、若是须要在不一样的时刻指定、排列和执行请求,能够选用命令模式,把这些请求封装成为命令对象,而后实现把请求队列化

三、若是须要支持取消操做,能够选用命令模式,经过管理命令对象,能很容易的实现命令的恢复和重作的功能

四、若是须要支持当系统崩溃时,能把对系统的操做功能从新执行一遍,能够选用命令模式,把这些操做功能的请求封装成命令对象,而后实现日志命令,就能够在系统恢复回来后,经过日志获取命令列表,从而从新执行一遍功能

五、在须要事务的系统中,能够选用命令模式,命令模式提供了对事务进行建模的方法,命令模式有一个别名就是Transaction。

十8、观察者模式(Observer)

一、定义

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都获得通知并自动更新。

二、类图

Subject:目标对象,一般具备以下功能:

  1. 一个目标能够被多个观察者观察;

  2. 目标提供对观察者注册和退订的维护;

  3. 当目标的状态发生变化时,目标负责通知全部注册的、有效的观察者; Observer:定义观察者的接口,提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,能够在这个方法里面回调目标对象,以获取目标对象的数据。

ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知全部注册有效的观察者,让观察者执行相应的处理。

ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,好比更新自身的状态以保持和目标的相应状态一致。

三、调用顺序

四、示例代码

十8、访问者模式(Visitor)

一、定义

表示一个做用于某个对象结构中的各元素的操做。它使你能够在不改变各元素的类 的前提下定义做用于这些元素的新操做。

二、类图

Visitor:访问者接口,为全部的访问者对象声明一个visit方法,用来表明为对象结构添加的功能,理论上能够表明任意的功能。

ConcreteVisitor:具体的访问者实现对象,实现要真正被添加到对象结构中的功能。

Element:抽象的元素对象,对象结构的顶层接口,定义接受访问的操做。

ConcreteElement:具体元素对象,对象结构中具体的对象,也是被访问的对象,一般会回调访问者的真实功能,同时开放自身的数据供访问者使用。

ObjectStructure:对象结构,一般包含多个被访问的对象,它能够遍历这多个被访问的对象,也可让访问者访问它的元素。能够是一个复合或是一个集合,如一个列表或无序集合。

三、调用顺序

四、示例代码

五、什么时候选用访问者模式

一、若是想对一个对象结构,实施一些依赖于对象结构中的具体类的操做,可使用访问者模式。

二、若是想对一个对象结构中的各个元素,进行不少不一样的并且不相关的操做,为了不这些操做使得类变得杂乱,可使用访问者模式,把这些操做分散到不一样的访问者对象中去,每一个访问者对象实现同一类功能。

三、若是对象结构不多变更,可是须要常常给对象结构中的元素对象定义新的操做,可使用访问者模式。

二10、状态模式(State)

一、定义

容许一个对象在其内部状态改变时改变它的行为。对象看起来彷佛修改了它的类。

二、类图

三、调用顺序

四、示例代码

五、什么时候选用状态模式

一、若是一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态来改变它的行为

二、若是一个操做中含有庞大的多分支语句,并且这些分支依赖于该对象的状态

二11、解释器模式(Interpreter)

一、定义

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

二、类图

AbstractExpression:定义解释器的接口,约定解释器的解释操做。

TerminalExpression:终结符解释器,用来实现语法规则中和终结符相关的操做,再也不包含其它的解释器,若是用组合模式来构建抽象语法树的话,就至关于组合模式中的叶子对象,能够有多种终结符解释器。

NonterminalExpression:非终结符解释器,用来实现语法规则中非终结符相关的操做,一般一个解释器对应一个语法规则,能够包含其它的解释器,若是用组合模式来构建抽象语法树的话,就至关于组合模式中的组合对象,能够有多种非终结符解释器。

Context:上下文,一般包含各个解释器须要的数据,或是公共的功能。

Client:客户端,指的是使用解释器的客户端,一般在这里去把按照语言的语法作的表达式,转换成为使用解释器对象描述的抽象语法树,而后调用解释操做。

三、调用顺序

二12、迭代器模式(Iterator)

一、定义

提供一种方法顺序访问一个聚合对象中各个元素,而又不须要暴露该对象的内部表示。

二、类图

Iterator:迭代器接口。定义访问和遍历元素的接口。

ConcreteIterator:具体的迭代器实现对象。实现对聚合对象的遍历,并跟踪遍历时的当前位置。

Aggregate:聚合对象。定义建立相应迭代器对象的接口。

ConcreteAggregate:具体聚合对象。实现建立相应的迭代器对象。

三、示例代码

二十3、中介者模式(Mediator)

一、定义

用一个中介对象来封装一系列的对象交互。中介者使得各对象不须要显示地相互引用,从而使其耦合松散,并且能够独立的改变他们之间的交互。

二、类图

Mediator:中介者接口。在里面定义各个同事之间交互须要的方法,能够是公共的通信方法,好比changed方法,你们都用,也能够是小范围的交互方法。

ConcreteMediator:具体中介者实现对象。它须要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。

Colleague:同事类的定义,一般实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,好比:每一个具体同事类都应该知道中介者对象,也就是具体同事类都会持有中介者对象,就能够定义到这个类里面。

ConcreteColleague:具体的同事类,实现本身的业务,在须要与其它同事通信的时候,就与持有的中介者通讯,中介者会负责与其它的同事交互。

三、调用顺序

四、示例代码

五、什么时候选用中介者模式

若是一组对象之间的通讯方式比较复杂,致使相互依赖、结构混乱,能够采用中介者模式,把这些对象相互的交互管理起来,各个对象都只须要和中介者交互,从而使得各个对象松散耦合,结构也更清晰易懂。

若是一个对象引用不少的对象,并直接跟这些对象交互,致使难以复用该对象。能够采用中介者模式,把这个对象跟其它对象的交互封装到中介者对象里面,这个对象就只须要和中介者对象交互就能够了。

二十4、备忘录模式(Memento)

一、定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。这样之后就能够将该对象恢复到原先保存的状态。

二、类图

Memento:备忘录。主要用来存储原发器对象的内部状态,可是具体须要存储哪些数据是由原发器对象来决定的。另外备忘录应该只能由原发器对象来访问它内部的数据,原发器外部的对象不该该能访问到备忘录对象的内部数据。

Originator:原发器。使用备忘录来保存某个时刻原发器自身的状态,也可使用备忘录来恢复内部状态。

Caretaker:备忘录管理者,或者称为备忘录负责人。主要负责保存备忘录对象,可是不能对备忘录对象的内容进行操做或检查。

三、调用顺序

四、示例代码

相关文章
相关标签/搜索