Design Patterns
命令模式
刘 伟 (Sunny)\rweiliu_china@126.com
大纲
\r
命令模式概述\r命令模式的结构与实现\r命令模式的应用实例\r实现命令队列\r记录请求日志\r实现撤销操作\r宏命令\r命令模式的优缺点与适用环境
很多软件都能够自定义快捷键
命令模式概述
开关与电灯、排气扇示意图
命令模式概述
分析\r现实生活\r相同的开关可以通过不同的电线来控制不同的电器\r开关 ? ? 请求发送者\r电灯 ? ? 请求的最终接收者和处理者\r开关和电灯之间并不存在直接耦合关系,它们通过电线连接在一起,使用不同的电线可以连接不同的请求接收者
命令模式概述
分析\r软件开发\r按钮 ? ? 请求发送者\r事件处理类 ? ? 请求的最终接收者和处理者\r发送者与接收者之间引入了新的命令对象(类似电线),将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法\r相同的按钮可以对应不同的事件处理类
命令模式概述
动机\r将请求发送者和接收者完全解耦\r发送者与接收者之间没有直接引用关系\r发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求
命令模式
命令模式概述
命令模式的定义\r\r\r\r\r\r对象行为型模式
命令模式概述
命令模式的定义\r别名为动作(Action)模式或事务(Transaction)模式\r“用不同的请求对客户进行参数化”\r“对请求排队”\r“记录请求日志”\r“支持可撤销操作”
命令模式的结构与实现
命令模式的结构\r\r
命令模式的结构与实现
命令模式的结构\r命令模式包含以下4个角色:\rCommand(抽象命令类)\rConcreteCommand(具体命令类)\rInvoker(调用者)\rReceiver(接收者)\r
命令模式的结构与实现
命令模式的实现\r命令模式的本质是对请求进行封装\r一个请求对应于一个命令,将发出命令的责任和执行命令的责任分开\r命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的
命令模式的结构与实现
命令模式的实现\r典型的抽象命令类代码:
命令模式的结构与实现
命令模式的实现\r典型的调用者(请求发送者)类代码:
命令模式的结构与实现
命令模式的实现\r典型的具体命令类代码:
命令模式的结构与实现
命令模式的实现\r典型的请求接收者类代码:
命令模式的应用实例
实例说明
命令模式的应用实例
实例类图
功能键设置结构图
命令模式的应用实例
实例代码\r(1) FunctionButton:功能键类,充当请求调用者(请求发送者)\r(2) Command:抽象命令类\r(3) ExitCommand:退出命令类,充当具体命令类\r(4) HelpCommand:帮助命令类,充当具体命令类\r(5) SystemExitClass:退出系统模拟实现类,充当请求接收者\r(6) DisplayHelpClass:显示帮助文档模拟实现类,充当请求接收者\r(7) 配置文件App.config\r(8) Program:客户端测试类
演示……
参考代码 (DesignPattern\CommandSample)
命令模式的应用实例
结果及分析\r如果需要更换具体命令类,无须修改源代码,只需修改配置文件,完全符合开闭原则\r每一个具体命令类对应一个请求的处理者(接收者),通过向请求发送者注入不同的具体命令对象可以使相同的发送者对应不同的接收者,从而实现“将一个请求封装为一个对象,用不同的请求对客户进行参数化”,客户端只需要将具体命令对象作为参数注入请求发送者,无须直接操作请求的接收者
实现命令队列
动机\r当一个请求发送者发送一个请求时,有不止一个请求接收者产生响应,这些请求接收者将逐个执行业务方法,完成对请求的处理\r增加一个CommandQueue类,由该类负责存储多个命令对象,而不同的命令对象可以对应不同的请求接收者\r批处理\r\r\r
实现命令队列
实现\r\r\r
记录请求日志
动机\r将请求的历史记录保存下来,通常以日志文件(Log File)的形式永久存储在计算机中\r为系统提供一种恢复机制\r可以用于实现批处理\r防止因为断电或者系统重启等原因造成请求丢失,而且可以避免重新发送全部请求时造成某些命令的重复执行
记录请求日志
实现\r将发送请求的命令对象通过序列化写到日志文件中\r命令类必须使用属性[Serializable]标记为可序列化
命令对象
日志文件
序列化
实现撤销操作
实例\r可以通过对命令类进行修改使得系统支持撤销(Undo)操作和恢复(Redo)操作
实现撤销操作
结构
简易计算器结构图
实现撤销操作
实现\r加法类:Adder(请求接收者)\r抽象命令类:AbstractCommand\r加法命令类:AddCommand(具体命令类)\r计算器界面类:CalculatorForm(请求发送者)\r客户端测试类:Program\r
演示……
参考代码 (DesignPattern\CommandUndoSample)
宏命令
动机\r宏命令(Macro Command)又称为组合命令(Composite Command),它是组合模式和命令模式联用的产物\r宏命令是一个具体命令类,它拥有一个集合,在该集合中包含了对其他命令对象的引用\r当调用宏命令的Execute()方法时,将递归调用它所包含的每个成员命令的Execute()方法。一个宏命令的成员可以是简单命令,还可以继续是宏命令\r执行一个宏命令将触发多个具体命令的执行,从而实现对命令的批处理
宏命令
结构
命令模式的优缺点与适用环境
模式优点\r降低了系统的耦合度\r新的命令可以很容易地加入到系统中,符合开闭原则\r可以比较容易地设计一个命令队列或宏命令(组合命令)\r为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案\r
命令模式的优缺点与适用环境
模式缺点\r使用命令模式可能会导致某些系统有过多的具体命令类(针对每一个对请求接收者的调用操作都需要设计一个具体命令类)
命令模式的优缺点与适用环境
模式适用环境\r系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互\r系统需要在不同的时间指定请求、将请求排队和执行请求\r系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作\r系统需要将一组操作组合在一起形成宏命令
END
Thanks!