C++ 设计模式之命令模式

目录

 

1. 设计目的

2. 设计原理

3. UML设计

4. 代码实现

5. 总结


1. 设计目的

将发送者操作与接收者逻辑作解耦,使接收者的输出结果更加的灵活多变。比如,UI界面操作, UI(发送者)点击5s后显示按钮, 直接调用就需要改写显示逻辑对象,添加5s后显示的方法;可如果添加个命令对象,将UI的命令打包给命令对象,那么就可以把5s延时在命令对象里添加,而不用修改显示对象,这样显示对象的职能更单一。

2. 设计原理

a) 在发送者与接收者之间添加一个命令管理对象(Invoker)和命令类. 发送者操作命令管理对象,名利管理对象管理命令类实例.命令类关联到接受者.

b) 命令类是一系列抽象关系的命令类.如, copyCommand, pasteCommand...,命令类对象只用接受者对象和所执行命令的携带参数来初始化.且只有一个execute()执行函数. 此方法包含接收者的对应操作.

c) 当发送者执行命令后, 实例化的命令对象(受命令管理管理)执行execute方法.

3. UML设计

以UI操作编辑器为例:

4. 代码实现

代码见:https://github.com/luozichao324/Design-Patterns/tree/main/Command/Command

5. 总结

应用场景

a)如果需要通过操作来参数化对象, 可使用命令模式。

b) 如果想要将操作放入队列中、 操作的执行或者远程执行操作, 可使用命令模式。同其他对象一样, 命令也可以实现序列化 (序列化的意思是转化为字符串), 从而能方便地写入文件或数据库中。 一段时间后, 该字符串可被恢复成为最初的命令对象。 因此,你可以延迟或计划命令的执行。 但其功能远不止如此! 使用同样的方式, 你还可以将命令放入队列、 记录命令或者通过网络发送命令.

c) 如果想要实现操作回滚功能, 可使用命令模式。尽管有很多方法可以实现撤销和恢复功能, 但命令模式可能是其中最常用的一种。

为了能够回滚操作, 你需要实现已执行操作的历史记录功能。 命令历史记录是一种包含所有已执行命令对象及其相关程序状态备份的栈结构。

这种方法有两个缺点。 首先, 程序状态的保存功能并不容易实现, 因为部分状态可能是私有的。 你可以使用备忘录模式来在一定程度上解决这个问题。其次, 备份状态可能会占用大量内存。 因此, 有时你需要借助另一种实现方式: 命令无需恢复原始状态, 而是执行反向操作。 反向操作也有代价: 它可能会很难甚至是无法实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值