欢迎来到天天文库
浏览记录
ID:40523268
大小:109.50 KB
页数:10页
时间:2019-08-04
《Command命令模式介绍》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Command命令模式介绍:Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。如下图:有时我们必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息,此时无法抵御变化的紧耦合是不合适的。如:需要对行为进行“记录、撤销/重做、事务”等处理。我们所要做的是将依赖关系转化,将紧耦合变为松耦合。则上图的形式转化为如下形式:Command模式通过将请求本身变成一个对象来使行为请求者可向未指定的应用对象提出请求。GoF《设计模式》中说道:将一个请求封装为一个对象
2、,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。Command命令模式结构:定义场景:现在来看一个场景:对于notepad大家都很熟悉,在我们使用notepad打开一个文档之后,往往做一些操作,如;输入字符(Write)、删除前一个字符(Delete)、撤销刚才的操作(UnDo)。现在我们就用Console程序模拟这个过程。代码实现与结构分析:在实现代码前先说明实现Command模式需要烤炉的一些问题:1、一个命令对象应达到何种智能程度:命令对象的能力可大可小。这样就出现了两个极端。一是:它仅确定一个接收者和执行该请
3、求的动作;一是:它自己实现所有功能,根本不需要额外的接收者对象。我给他们起了便于我方便记忆的名字,第一种叫OperationCommand,第二种叫ObjectCommand。当然只是为了便于记忆和理解,如有不理解,在代码实现与结构分析最后我会再谈谈我的想法,如有不妥,还请多提意见,一会在下面的代码中会分别对这两种情况进行示范。2、支持取消和重做:为了达到这个目的ConcreteCommand类中要存储额外的状态信息。也就是上图中ConcreteCommand的state属性。3、避免取消操作中过程中的错误积累:由于命令重复的执行、取消执行和重执行的过程可能
4、会积累错误,以致一个应用的状态最终偏离初始值。这就有必要在Command中存入更多的信息以保证这些对象可被精确的复原。下面来看看代码上的实现:首先,我先作一个OperationCommand的例子,先做一个请求的接收者Document(也就是结构图中的Receiver)classDocument{publicstringstrContent;publicDocument(){strContent="";}}在这个程序中我们还要定义一个抽象类Command,对于OperationCommand类型来说,它仅确定一个接收者和执行该请求的动作。所以,在抽象类Com
5、mand中,只声明一个Excute的方法。这个方法在其子类中进行实现。(当然这个Command还可以定义成接口)abstractclassCommand{publicCommand(){}publicabstractvoidExcute();}接下来,就要实现各种操作(结构图中的ConcreteCommand),代码如下//写操作classWriteCommand:Command{Documentdoc;ArrayListObjectState;publicWriteCommand(Documentdoc,ArrayListstate){this.doc=d
6、oc;ObjectState=state;}publicoverridevoidExcute(){doc.strContent+=Console.ReadLine();ObjectState.Add(doc.strContent);}}//删除操作classDeleteCommand:Command{Documentdoc;ArrayListObjectState;publicDeleteCommand(Documentdoc,ArrayListstate){this.doc=doc;ObjectState=state;}publicoverridevoid
7、Excute(){doc.strContent=doc.strContent.Substring(0,doc.strContent.Length-1);ObjectState.Add(doc.strContent);}}//撤销操作classUnDoCommand:Command{Documentdoc;ArrayListObjectState;publicUnDoCommand(Documentdoc,ArrayListstate){this.doc=doc;ObjectState=state;}publicoverridevoidExcute(){doc
8、.strContent=(string)Object
此文档下载收益归作者所有