首页 > 其他 > 详细

设计模式之11个行为型模式

时间:2017-01-13 01:22:48      阅读:165      评论:0      收藏:0      [点我收藏+]

行为型模式概述
行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化

行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用

通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。
行为型简介

职责链模式(Chain of Responsibility)

命令模式(Command)

解释器模式(Interpreter)

迭代器模式(Iterator)

中介者模式(Mediator)

备忘录模式(Memento)

观察者模式(Observer)

状态模式(State)

策略模式(Strategy)

模板方法模式(Template Method)

访问者模式(Visitor)

1.职责链模式

1.1 动机

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。

链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。

1.2 类图

技术分享

Handler: 抽象处理者
ConcreteHandler: 具体处理者
Client: 客户类
1.3 优点

降低耦合度

可简化对象的相互连接

增强给对象指派职责的灵活性

增加新的请求处理类很方便

1.4缺点

不能保证请求一定被接收。

系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。

1.5情景
有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定

在不明确指定接收者的情况下,向多个对象中的一个提交一个请求

动态指定一组对象处理请求

比如

早期的Java AWT事件模型(JDK 1.0及更早)

Java中的异常处理机制
2.命令模式
2.1 动机

命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。

2.2 类图

技术分享

Command: 抽象命令类
ConcreteCommand: 具体命令类
Invoker: 调用者
Receiver: 接收者
Client:客户类

2.3 优点

降低系统的耦合度。

新的命令可以很容易地加入到系统中。

可以比较容易地设计一个命令队列和宏命令(组合命令)。

可以方便地实现对请求的UndoRedo

2.4 缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

2.5 情景
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

系统需要在不同的时间指定请求、将请求排队和执行请求

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作

系统需要将一组操作组合在一起,即支持宏命令。

如:委派事件模型

3.解释器模式

4.迭代器模式

5.中介者模式

5.1 动机

在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责

对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。

5.2 类图

技术分享

Mediator: 抽象中介者
ConcreteMediator: 具体中介者
Colleague: 抽象同事类
ConcreteColleague: 具体同事类

5.3 优点

简化了对象之间的交互。

将各同事解耦。

减少子类生成。

可以简化各同事类的设计和实现。

5.4 缺点

在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护

5.5 情景

系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。

一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象

想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类。

6.备忘录

6.1动机

在应用软件的开发过程中,很多时候我们都需要记录一个对象的内部状态

在具体实现过程中,为了允许用户取消不确定的操作或从错误中恢复过来,需要实现备份点和撤销机制,而要实现这些机制,必须事先将状态信息保存在某处,这样才能将对象恢复到它们原先的状态。备忘录模式是一种给我们的软件提供后悔药的机制,通过它可以使系统恢复到某一特定的历史状态

6.2类图

技术分享

Originator: 原发器
Memento: 备忘录
Caretaker: 负责人

6.3优点

提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用先前存储起来的备忘录将状态复原。

实现了信息的封装,一个备忘录对象是一种原发器对象的表示,不会被其他代码改动,这种模式简化了原发器对象,备忘录只保存原发器的状态,采用堆栈来存储备忘录对象可以实现多次撤销操作,可以通过在负责人中定义集合对象来存储多个备忘录。

6.4缺点

资源消耗过大,如果类的成员变量太多,就不可避免占用大量的内存,而且每保存一次对象的状态都需要消耗内存资源,如果知道这一点大家就容易理解为什么一些提供了撤销功能的软件在运行时所需的内存和硬盘空间比较大了。

6.5情景

保存一个对象在某一个时刻的状态或部分状态,这样以后需要时它能够恢复到先前的状态。

如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态

7.观察者模式(Observer)

7.1动机

7.2类图

7.3优点

7.4缺点

7.5情景

8.状态模式(State)

8.1动机

8.2类图
8.3优点
8.4缺点
8.5情景

9.策略模式(Strategy)

9.1动机

9.2类图

9.3优点

9.4缺点

9.5情景

10.模板方法模式(Template Method)

10.1动机

10.2类图

10.3优点

10.4缺点

10.5情景

11.访问者模式(Visitor)

11.1动机

11.2类图

11.3优点

11.4缺点

11.5情景

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1891620

设计模式之11个行为型模式

原文:http://dba10g.blog.51cto.com/764602/1891620

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!