您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 17-C#设计模式-命令模式
命令模式刘伟(Sunny)weiliu_china@126.com大纲命令模式概述命令模式的结构与实现命令模式的应用实例实现命令队列记录请求日志实现撤销操作宏命令命令模式的优缺点与适用环境很多软件都能够自定义快捷键命令模式概述开关与电灯、排气扇示意图命令模式概述分析现实生活•相同的开关可以通过不同的电线来控制不同的电器•开关请求发送者•电灯请求的最终接收者和处理者•开关和电灯之间并不存在直接耦合关系,它们通过电线连接在一起,使用不同的电线可以连接不同的请求接收者命令模式概述分析软件开发•按钮请求发送者•事件处理类请求的最终接收者和处理者•发送者与接收者之间引入了新的命令对象(类似电线),将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法•相同的按钮可以对应不同的事件处理类命令模式概述动机将请求发送者和接收者完全解耦发送者与接收者之间没有直接引用关系发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求命令模式命令模式概述命令模式的定义对象行为型模式命令模式:将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。CommandPattern:Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.命令模式概述命令模式的定义别名为动作(Action)模式或事务(Transaction)模式“用不同的请求对客户进行参数化”“对请求排队”“记录请求日志”“支持可撤销操作”命令模式的结构与实现命令模式的结构receiverInvokerCommand+Execute()...ConcreteCommand-state:+Execute()...Receiver+Action()...Clientreceiver.Action();命令模式的结构与实现命令模式的结构命令模式包含以下4个角色:•Command(抽象命令类)•ConcreteCommand(具体命令类)•Invoker(调用者)•Receiver(接收者)命令模式的结构与实现命令模式的实现命令模式的本质是对请求进行封装一个请求对应于一个命令,将发出命令的责任和执行命令的责任分开命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的命令模式的结构与实现命令模式的实现典型的抽象命令类代码:abstractclassCommand{publicabstractvoidExecute();}命令模式的结构与实现命令模式的实现典型的调用者(请求发送者)类代码:classInvoker{privateCommandcommand;//构造注入publicInvoker(Commandcommand){this.command=command;}publicCommandCommand{get{returncommand;}//设值注入set{command=value;}}//业务方法,用于调用命令类的方法publicvoidCall(){command.Execute();}}命令模式的结构与实现命令模式的实现典型的具体命令类代码:classConcreteCommand:Command{privateReceiverreceiver;//维持一个对请求接收者对象的引用publicoverridevoidExecute(){receiver.Action();//调用请求接收者的业务处理方法Action()}}命令模式的结构与实现命令模式的实现典型的请求接收者类代码:classReceiver{publicvoidAction(){//具体操作}}命令模式的应用实例实例说明为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能键的功能,例如功能键FunctionButton可以用于退出系统(由SystemExitClass类来实现),也可以用于显示帮助文档(由DisplayHelpClass类来实现)。用户可以通过修改配置文件来改变功能键的用途,现使用命令模式来设计该系统,使得功能键类与功能类之间解耦,可为同一个功能键设置不同的功能。命令模式的应用实例实例类图功能键设置结构图FunctionButton-+PropertyImplementationPropertycommandCommand:Command:Command+++SetterGetterClick()set_Command(Commandvalue)get_Command()...:void:void:CommandCommand+Execute()...:voidExitCommand-seObj:SystemExitClass+Execute()...:voidSystemExitClass+Exit()...:voidseObj.Exit();HelpCommand-hcObj:DisplayHelpClass+Execute()...:voidDisplayHelpClass+Display()...:voidhcObj.Display();命令模式的应用实例实例代码(1)FunctionButton:功能键类,充当请求调用者(请求发送者)(2)Command:抽象命令类(3)ExitCommand:退出命令类,充当具体命令类(4)HelpCommand:帮助命令类,充当具体命令类(5)SystemExitClass:退出系统模拟实现类,充当请求接收者(6)DisplayHelpClass:显示帮助文档模拟实现类,充当请求接收者(7)配置文件App.config(8)Program:客户端测试类演示……参考代码(DesignPattern\CommandSample)命令模式的应用实例结果及分析如果需要更换具体命令类,无须修改源代码,只需修改配置文件,完全符合开闭原则每一个具体命令类对应一个请求的处理者(接收者),通过向请求发送者注入不同的具体命令对象可以使相同的发送者对应不同的接收者,从而实现“将一个请求封装为一个对象,用不同的请求对客户进行参数化”,客户端只需要将具体命令对象作为参数注入请求发送者,无须直接操作请求的接收者?xmlversion=1.0encoding=utf-8?configurationappSettingsaddkey=commandvalue=CommandSample.HelpCommand//appSettings/configuration实现命令队列动机当一个请求发送者发送一个请求时,有不止一个请求接收者产生响应,这些请求接收者将逐个执行业务方法,完成对请求的处理增加一个CommandQueue类,由该类负责存储多个命令对象,而不同的命令对象可以对应不同的请求接收者批处理实现命令队列实现usingSystem.Collections.Generic;namespaceCommandSample{classCommandQueue{//定义一个List来存储命令队列privateListCommandcommands=newListCommand();publicvoidAddCommand(Commandcommand){commands.Add(command);}publicvoidRemoveCommand(Commandcommand){commands.Remove(command);}//循环调用每一个命令对象的Execute()方法publicvoidExecute(){foreach(objectcommandincommands){((Command)command).Execute();}}}}记录请求日志动机将请求的历史记录保存下来,通常以日志文件(LogFile)的形式永久存储在计算机中•为系统提供一种恢复机制•可以用于实现批处理•防止因为断电或者系统重启等原因造成请求丢失,而且可以避免重新发送全部请求时造成某些命令的重复执行记录请求日志实现将发送请求的命令对象通过序列化写到日志文件中命令类必须使用属性[Serializable]标记为可序列化命令对象日志文件序列化实现撤销操作实例可以通过对命令类进行修改使得系统支持撤销(Undo)操作和恢复(Redo)操作设计一个简易计算器,该计算器可以实现简单的数学运算,还可以对运算实施撤销操作。实现撤销操作结构CalculatorForm-+PropertyImplementationPropertycommandCommand:AbstractCommand:AbstractCommand++++SetterGetterset_Command(AbstractCommandvalue)get_Command()Compute(intvalue)Undo()...:void:AbstractCommand:void:voidAbstractCommand{abstract}++Execute(intvalue)Undo()...:int:intAddCommand--addervalue:Adder:int++Execute(intvalue)Undo()...:int:intAdder-num:int=0+Add(intvalue)...:int简易计算器结构图实现撤销操作实现加法类:Adder(请求接收者)抽象命令类:AbstractCommand加法命令类:AddCommand(具体命令类)计算器界面类:CalculatorForm(请求发送者)客户端测试类:Program演示……参考代码(DesignPattern\CommandUndoSample)宏命令动机宏命令(MacroCommand)又称为组合命令(CompositeCommand),它是组合模式和命令模式联用的产物宏命令是一个具体命令类,它拥有一个集合,在该集合中包含了对其他命令对象的引用当调用宏命令的Execute()方法时,将递归调用它所包含的每个成员命令的Execute()方法。一个宏命令的成员可以是简单命令,还可以继续是宏命令执行一个宏命令将触发多个具体命令的执行,从而实现对命令的批处理宏命令结构1*InvokerCommand++++Ad
本文标题:17-C#设计模式-命令模式
链接地址:https://www.777doc.com/doc-5087768 .html