设计模式(C++实现)之Command

来源:互联网 发布:快递不送货上门 知乎 编辑:程序博客网 时间:2024/04/30 22:26

将一组行为定义为一个命令,供外部调用,方便命令执行

也可以将命令进行记录,方便进行Undo操作

经典的Command模式

看看一个生活中的例子,使用遥控器操作电视。将遥控器的各个按钮定制为命令,遥控器只需执行按下操作即可完成电视控制。

代码1:ICommand接口与其实例类

命令的具体类需要依赖命令的接收者,这样才可以对接收者进行操作,这里的接收者(Receiver为电视),还可以定义其他按键操作的逻辑,比如说换台,但这样需要定义的命令就太多了(这也是这个模式的缺点之一,类膨胀)

代码2:RemoteControl类,命令执行者(Invoker)

设置好命令后,执行OnBtnPressed,即完成遥控对电视的控制。

代码3:Television类,命令接收者(Receiver)

代码4:主函数(Client)

接下来我们看看GOF的类图和此例的类图吧,看看能不能将两个图的类比上~

图1:GOF类图

图2:例子的类图

RomoteControl(遥控器)就是GOF中的Invoker, Television就是Receiver。Client就是代码4中的主函数。

添加Undo操作的类改造

在命令中记录命令执行时的环境状态,并实现Undo的方法,然后将命令整体打包存储在队列中,在外部需要回滚时,取出命令,执行Undo操作。

代码5:改造ICommand接口 

代码6:改造TurnOnOffCommand类 

 

代码7:改造ChangeInputModeCommand类 

 

其中的m_memo就是用来记录命令执行前的状态便于在Undo执行时进行回滚。这里只是举了一个最简单的情况记录环境,抛砖引玉。

代码8:改造RemoteControl类 

代码9:添加Undo的执行

图3:带Undo的Command的类图

原创粉丝点击