《17 C#设计模式-命模式.ppt》由会员分享,可在线阅读,更多相关《17 C#设计模式-命模式.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、www.ChinaSA.infoDDesign esign P Patternsatterns命令模式命令模式命令模式命令模式刘刘 伟伟(Sunny)weiliu_www.ChinaSA.info大纲w命令模式概述w命令模式的结构与实现w命令模式的应用实例w实现命令队列w记录请求日志w实现撤销操作w宏命令w命令模式的优缺点与适用环境很多软件都能够自定义快捷键很多软件都能够自定义快捷键www.ChinaSA.info命令模式概述w开关与电灯、排气扇示意图www.ChinaSA.info命令模式概述w分析现实生活现实生活相同的开关可以通过不同的电线来控制不同的电器开关 请求发送者电灯 请求的最终接
2、收者和处理者开关和电灯之间并不存在直接耦合关系,它们通过电线连接在一起,使用不同的电线可以连接不同的请求接收者www.ChinaSA.info命令模式概述w分析软件开发软件开发按钮 请求发送者事件处理类 请求的最终接收者和处理者发送者与接收者之间引入了新的命令对象(类似电线),将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法相同的按钮可以对应不同的事件处理类www.ChinaSA.info命令模式概述w动机将请求发送者和接收者将请求发送者和接收者完全解耦完全解耦发送者与接收者之间发送者与接收者之间没有直接引用关系没有直接引用关系发送请求的对象发送请求的对象只需要知道如何发送请求
3、,而不必知只需要知道如何发送请求,而不必知道如何完成请求道如何完成请求命令模式命令模式www.ChinaSA.info命令模式概述w命令模式的定义对象行为型对象行为型模式模式命命令令模模式式:将将一一个个请请求求封封装装为为一一个个对对象象,从而让你可以用不同的请求对对客客户户进进行行参参数数化化,对对请请求求排排队队或者记记录录请请求求日日志志,以及支持可撤支持可撤销销的操作的操作。Command Pattern:Encapsulate a request as an object,thereby letting you parameterize clients with different
4、 requests,queue or log requests,and support undoable operations.www.ChinaSA.info命令模式概述w命令模式的定义别名为别名为动作动作(Action)模式或模式或事务事务(Transaction)模式模式“用不同的请求对客户进行参数化用不同的请求对客户进行参数化”“对请求排队对请求排队”“记录请求日志记录请求日志”“支持可撤销操作支持可撤销操作”www.ChinaSA.info命令模式的结构与实现w命令模式的结构www.ChinaSA.info命令模式的结构与实现w命令模式的结构命令模式包含以下命令模式包含以下4个角色:
5、个角色:Command(抽象命令类)ConcreteCommand(具体命令类)Invoker(调用者)Receiver(接收者)www.ChinaSA.info命令模式的结构与实现w命令模式的实现命令模式的本质是命令模式的本质是对请求进行封装对请求进行封装一个请求对应于一个命令一个请求对应于一个命令,将发出命令的责任和执行,将发出命令的责任和执行命令的责任分开命令的责任分开命令模式命令模式允许请求的一方和接收的一方独立开来允许请求的一方和接收的一方独立开来,使,使得得请求的一方不必知道接收请求的一方的接口请求的一方不必知道接收请求的一方的接口,更不,更不必知道必知道请求如何被接收请求如何被接
6、收、操作是否被执行操作是否被执行、何时被执何时被执行行,以及是,以及是怎么被执行的怎么被执行的www.ChinaSA.info命令模式的结构与实现w命令模式的实现典型的抽象命令类代码:典型的抽象命令类代码:abstract class Command public abstract void Execute();www.ChinaSA.info命令模式的结构与实现w命令模式的实现典型的调用者(请求发送者)类代码:典型的调用者(请求发送者)类代码:class Invoker private Command command;/构造注入构造注入 public Invoker(Command comm
7、and)mand=command;public Command Command get return command;/设值设值注入注入 set command=value;/业务业务方法,用于方法,用于调调用命令用命令类类的方法的方法 public void Call()command.Execute();www.ChinaSA.info命令模式的结构与实现w命令模式的实现典型的具体命令类代码:典型的具体命令类代码:class ConcreteCommand:Commandprivate Receiver receiver;/维维持一个持一个对请对请求接收者求接收者对对象的引用象的引用pub
8、lic override void Execute()receiver.Action();/调调用用请请求接收者的求接收者的业务处业务处理方法理方法Action()www.ChinaSA.info命令模式的结构与实现w命令模式的实现典型的请求接收者类代码:典型的请求接收者类代码:class Receiverpublic void Action()/具体操作www.ChinaSA.info命令模式的应用实例w实例说明为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能 键 的 功 能,例 如 功 能 键 FunctionButton可 以 用 于 退 出 系 统(由SystemExit
9、Class类 来 实 现),也 可 以 用 于 显 示 帮 助 文 档(由DisplayHelpClass类来实现)。用户可以通过修改配置文件来改变功能键的用途,现使用命令模式来设计该系统,使得功能键类与功能类之间解耦,可为同一个功能键设置不同的功能。www.ChinaSA.info命令模式的应用实例w实例类图功能键设置结构图功能键设置结构图www.ChinaSA.info命令模式的应用实例w实例代码(1)FunctionButton:功能键类,充当请求调用者(请求发送者):功能键类,充当请求调用者(请求发送者)(2)Command:抽象命令类:抽象命令类(3)ExitCommand:退出命令
10、类,充当具体命令类:退出命令类,充当具体命令类(4)HelpCommand:帮助命令类,充当具体命令类:帮助命令类,充当具体命令类(5)SystemExitClass:退出系统模拟实现类,充当请求接收者:退出系统模拟实现类,充当请求接收者(6)DisplayHelpClass:显示帮助文档模拟实现类,充当请求接收者:显示帮助文档模拟实现类,充当请求接收者(7)配置文件配置文件App.config(8)Program:客户端测试类:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternCommandSample)www.ChinaSA.info命令模式的应用实例w结果及分析如果
11、需要更换具体命令类,无须修改源代码,只需修改如果需要更换具体命令类,无须修改源代码,只需修改配置文件配置文件,完全完全符合开闭原则符合开闭原则每一个每一个具体命令类具体命令类对应一个对应一个请求的处理者(接收者)请求的处理者(接收者),通过向请,通过向请求发送者注入不同的具体命令对象可以使相同的发送者对应不同求发送者注入不同的具体命令对象可以使相同的发送者对应不同的接收者,从而实现的接收者,从而实现“将一个请求封装为一个对象,用不同的请将一个请求封装为一个对象,用不同的请求对客户进行参数化求对客户进行参数化”,客户端只需要将具体命令对象作为参数客户端只需要将具体命令对象作为参数注入请求发送者,
12、无须直接操作请求的接收者注入请求发送者,无须直接操作请求的接收者 www.ChinaSA.info实现命令队列w动机当一个请求发送者发送一个请求时,有当一个请求发送者发送一个请求时,有不止一个请求不止一个请求接收者产生响应接收者产生响应,这些请求接收者将逐个执行业务方,这些请求接收者将逐个执行业务方法,完成对请求的处理法,完成对请求的处理增加一个增加一个CommandQueue类类,由该类负责,由该类负责存储多个存储多个命令对象命令对象,而不同的命令对象可以对应不同的请求接,而不同的命令对象可以对应不同的请求接收者收者批处理批处理www.ChinaSA.info实现命令队列w实现using S
13、ystem.Collections.Generic;namespace CommandSample class CommandQueue /定定义义一个一个List来存来存储储命令命令队队列列 private List commands=new List();public void AddCommand(Command command)commands.Add(command);public void RemoveCommand(Command command)commands.Remove(command);/循循环调环调用每一个命令用每一个命令对对象的象的Execute()方法方法 pub
14、lic void Execute()foreach(object command in commands)(Command)command).Execute();www.ChinaSA.info记录请求日志w动机将请求的历史记录保存下来将请求的历史记录保存下来,通常以,通常以日志文件日志文件(Log File)的形式永久存储在计算机中的形式永久存储在计算机中为系统提供一种恢复机制可以用于实现批处理防止因为断电或者系统重启等原因造成请求丢失,而且可以避免重新发送全部请求时造成某些命令的重复执行www.ChinaSA.info记录请求日志w实现将发送请求的命令对象将发送请求的命令对象通过序列化写到
15、日志文件通过序列化写到日志文件中中命令类必须使用属性命令类必须使用属性Serializable标记为标记为可序列化可序列化命令对象日志文件日志文件序列化序列化www.ChinaSA.info实现撤销操作w实例可以通过对命令类进行修改使得系统支持可以通过对命令类进行修改使得系统支持撤销撤销(Undo)操作操作和和恢复恢复(Redo)操作操作设计一个简易计算器,该计算器可以实现简单的数学运算,还可以对运算实施撤销操作。www.ChinaSA.info实现撤销操作w结构简易计算器结构图简易计算器结构图www.ChinaSA.info实现撤销操作w实现加法类:加法类:Adder(请求接收者)(请求接收
16、者)抽象命令类:抽象命令类:AbstractCommand加法命令类:加法命令类:AddCommand(具体命令类)(具体命令类)计算器界面类:计算器界面类:CalculatorForm(请求发送者)(请求发送者)客户端测试类:客户端测试类:Program演示演示演示演示参考代码参考代码(DesignPatternCommandUndoSample)www.ChinaSA.info宏命令w动机宏命令宏命令(Macro Command)又称为又称为组合命令组合命令(Composite Command),它是,它是组合模式和命令模式组合模式和命令模式联用的产物联用的产物宏命令是一个具体命令类,它宏
17、命令是一个具体命令类,它拥有一个集合拥有一个集合,在该集合中包含了,在该集合中包含了对其他命令对象的引用对其他命令对象的引用当调用宏命令的当调用宏命令的Execute()方法时,方法时,将递归调用它所包含的每个将递归调用它所包含的每个成员命令的成员命令的Execute()方法。方法。一个宏命令的成员可以是简单命令,一个宏命令的成员可以是简单命令,还可以继续是宏命令还可以继续是宏命令执行一个宏命令将触发多个具体命令的执行,从而执行一个宏命令将触发多个具体命令的执行,从而实现对命令的实现对命令的批处理批处理www.ChinaSA.info宏命令w结构www.ChinaSA.info命令模式的优缺点
18、与适用环境w模式优点降低了系统的耦合度降低了系统的耦合度新的命令可以很容易地加入到系统中,新的命令可以很容易地加入到系统中,符合开闭原则符合开闭原则可以比较容易地设计一个可以比较容易地设计一个命令队列或命令队列或宏命令(组合命令)宏命令(组合命令)为请求的为请求的撤销撤销(Undo)和恢复和恢复(Redo)操作提供了一种设计和实现方案操作提供了一种设计和实现方案www.ChinaSA.info命令模式的优缺点与适用环境w模式缺点使用命令模式使用命令模式可能会导致某些系统有过可能会导致某些系统有过多的具体命令类多的具体命令类(针对每一个对请求接(针对每一个对请求接收者的调用操作都需要设计一个具体命收者的调用操作都需要设计一个具体命令类)令类)www.ChinaSA.info命令模式的优缺点与适用环境w模式适用环境系统需要系统需要将请求调用者和请求接收者解将请求调用者和请求接收者解耦耦,使得调用者和接收者不直接交互,使得调用者和接收者不直接交互系统需要系统需要在不同的时间指定请求、将请在不同的时间指定请求、将请求排队和执行请求求排队和执行请求系统需要系统需要支持命令的撤销支持命令的撤销(Undo)操作和操作和恢复恢复(Redo)操作操作系统需要系统需要将一组操作组合在一起形成宏将一组操作组合在一起形成宏命令命令www.ChinaSA.infoENDEND