01 设计模式示例讲解(Command命令模式)(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

13
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的活动序列
1. 2. 3.
4.
客户端指明一个具体命令ConcreteCommand,并指明接收者; 请求者对象保存了ConcreteCommand对象; 请求者对象通过调用action()方法发出请求,如果命令是能够撤 销的,那么ConcreteCommand保存了调用execute()方法之前的 状态; ConcreteCommand对象调用接收的一方的方法执行请求;
19
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
使用命令模式的语意环境
4、系统需要支持命令的撤销。命令对象可以把状态存 储起来,等到客户端需要撤销命令所产生的效果时, 可以调用undo()方法;把命令产生的效果撤销掉, 命令对象还可以支持rendo()方法,以供客户端在需 要时,重新实施命令的效果; 5、如果一个系统要将系统中所有的数据更新到一个日 志里,以便在系统崩溃时,可以跟据日志里的所有的 数据更新命令,重新调用execute()方法,一条一条 的调用这些命令,从而恢复系统在崩溃前所做的数据 更新;
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的使用
玉帝让太白金星招悟空上天庭:
23
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的使用
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的语意描述
命令模式是对命令的封装,命令模式把发出命令 的责任和执行命令的责任分割开,委派给不同 的对象。 1、命令:一个操作; 2、发命令者:发出一个请求,要求执行一个操 作; 3、接收方:收到请求,执行操作; 4、命令模式允许请求的一方和接收的一方独立 开来,使得请求的一方不必知道接收请求的一 方的接口,更不必知道请求是怎么被接收以及 操作是否被执行、何时执行、如何执行的;
20
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的优缺点
优点: v 命令模式把请求一个操作的对象与知道怎么执行一个 操作的对象分隔开; v 命令类和其它别的类一样可以推广和修改; v 可以把命令对象聚合在一起,合成为合成命令; v 由于加进的具体命令类不影响其它的类,因此增加新 的命令类很容易; 缺点:可能会导致某些系统有过多的命令类,几十、几 百、甚至几千个,在这样的系统中命令模式的实现变 得不现实;
命令模式的实现
命令的“轻”与“重”: 1. 命令设计得“轻”一些:命令只是提供了一个请 求者和接收者之间的藕合而已,命令代表请求 者实现请求; 2. 命令设计得“重”一些:命令应当实现所有的细 节,包括请求所代表操作而不再需要接收者; 3. 最“轻”和最“重”之间:命令类可以动态地决定 调用哪一个接收者类;
16
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的实现
关于是否支持Undo和Redo 如果一个命令类提供一个方法,比如叫UnExecute(), 以恢复其操作的效果,那么命令类就可以支持Undo和 Redo。此时具体命令类需要存储的状态信息: 1、接收者对象实际上实施请求所代表的操作; 2、对接收者对象所作的操作所需要的参数; 3、接收者类最初的状态接收者必须提供适当的方法, 使命令类可以通过调用这个方法,以便接收者类恢复 原有状态
14
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的活动时序图
15
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
21
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的使用
事件授权处理、Swing组件的Undo和Redo; “玉帝让太 白金星招悟空上天庭” 、诸葛亮锦囊妙计杀魏延……
22
周甫(zoofchow@hotmail.com)
10
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
接收者角色源代码
public class Receiver { public Receiver() { //write code here } public void action() { System.out.println("Action has been taken."); } }
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
具体命令角色源代码
public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } public void execute() { receiver.action(); } }
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式
命令模式属于对象的行为模式,又称为 行动模式或者交易模式。 封装在一个对象中,命令模式允许系统 使用不同的请求把客户端参数化,对请求 排对或者记录请求日志,可以提供命令的 撤销和恢复功能
4
周甫(zoofchow@hotmail.com)
5 周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的优点
命令允许请求的一方和接收请求的一方能够独立演化,从而具有以 下优点: 1、命令模式使新的命令很容易的被加到系统里; 2、允许接收请求的一方决定是否要否决请求; 3、能够较容易的设计一个命令队列; 4、可以很容易的实现对一个命令的Undo和Redo; 5、在需要的情况下可以很容易的将命令记入日志; 在C语言中命令模式便是面向对象形式的回呼(Callback)。
玉帝让太白金星招悟空上天庭: 五个角色: 1、命令角色:圣旨; 2、具体命令角色:具体圣旨--立即报道; 3、请求者角色:太白金星; 4、接收者角色:美猴王; 5、客户角色:玉帝;
24
18
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
使用命令模式的语意环境
1. 命令模式作为“回呼”在面向对象系统中的替代。“回呼
”一般是先将一个函数登记上,然后在以后调用此函 数; 2. 需要在不同的时间指定请求、将请求排队。一个命令 对象可以和原先的请求发出者有不同的生命期。换言 之,原先的请求发出者可能已经不在了,而命令对象 本身仍然是活动的。这是命令的接收者可以在本地, 也可以在网络上的另外一个地址,命令对象可以在串 行化以后传送到另外一台机器上; 3. 一个系统需要支持交易,一个交易结构封装了一组数 据更新命令,使用命令模式实现交易结构可以使系统 增加新的交易类型;
设计模式
示例讲解 命令模式(1)
Version 1.0
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
课程பைடு நூலகம்绍
• • •
本课程主要讲授命令模式基础知识 适用于Java开发工程师 面向的学员是对Servlet,JSP有基本了 解的J2EE开发工程师
6
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式中的角色
1. 2. 3. 4. 5.
客户角色:创建一个具体命令对象,并确定其接收者; 命令角色:声明了一个所有具体命令类的抽象接口,这是一个抽 象角色,通常由一个Java接口或者一个Java抽象类事项; 具体命令角色:定义接收者和行为之间的一个弱藕合,实现执行 方法,负责调用接收者的相应操作。 请求者角色:负责调用命令对象执行请求,相关的方法叫做行动 方法; 接收者角色:负责具体实施和执行一个请求。任何一个类都可以 称为接收者,实施和执行请求的方法叫行动方法
7
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
示意性使用举例
• 系统的结构图:
8
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
客户角色源代码
public class Client { public static void main(String[] args) { Receiver receiver = new Receiver(); Command command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(command); invoker.action(); } }
11 周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
抽象命令角色源代码
public interface Command { void execute(); }
12
周甫(zoofchow@hotmail.com)
9
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
请求者角色源代码
public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } public void action() { command.execute(); } }

2
全部课程时间大约是40分钟
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
概要
• 命令模式的语意描述 • 命令模式的优点 • 命令模式中的角色 • 命令模式实例
3
周甫(zoofchow@hotmail.com)
17
周甫(zoofchow@hotmail.com)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
命令模式的实现
1、如果只需要提供一层的Undo和Redo,那么 系统只需要存储最后被执行的那个命令对象; 2、如果需要支持多层的Undo和Redo,那么系 统就需要存储曾经被执行过的命令清单,清单 能允许的最大长度便是系统所支持的Undo和 Redo 的层数,沿着清单上的命令的反命令( UnExecute())就是undo,沿着清单上的命令 顺序执行就是,就是redo。
相关文档
最新文档