命令模式(Command Pattern)
一、概念
命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作。首先请求的一方发出请求要求执行一个操作,然后接收的一方收到请求,并执行操作。
- 命令模式解耦了
请求方
和接收方
,请求方只需要发送命令而不需要关心命令是如何被接收的,不关心命令怎么操作,也不关心命令是否被执行等。 - 核心思想:将命令或者请求封装成对象,
通过一个中间层来解耦请求调用者和请求最终执行者
命令模式的使用场景有限了解思想即可
二、适用场景
在开发中,请求调用者和请求最终执行者通常都是一种紧耦合关系,但是这种情况下,当我们需要修改行为(功能)时,如需要撤销或者重做时,只能修改请求者的源代码,而命令模式会通过在请求调用者和请求最终执行者之间引入一个抽象接口 来将请求者和执行者进行解耦,这样如果需要修改行为时,只需要增加对应行为的命令就可以了,完全不需要修改请求者的源码。
三、参与者
- 接收者角色(Receiver): 负责具体执行一个请求 。
- 该角色就是具体的干活者,命令就是传递到这里被执行的
- 抽象命令角色(Command): 通常该角色是一个接口,定义需要执行的所有命令行为
- 具体命令角色(Concrete Command) :命令接口的具体实现,该类内部维护一个
接收者(Receiver)
,收到执行命令请求后会调用Receiver的对应方法
- 调用者角色(Invoker) : 接收客户端的命令并调用相应的命令执行 。 通常可以持有一个或多个 Command 命令
- Client 用户
四、代码例子
电视它有关机、开机、换台的功能,我们还有一个具有学习功能的遥控器,给它和电视配置关机、开机、换台的红外线指令,遥控器本身并不知道这些红外线有什么功能,但是电视接收到特定红外线会执行相应的指令
接收者角色(Receiver): TV
抽象命令角色(Command): Command
具体命令角色(Concrete Command) :TurnOnCommand、TurnOffCommand、NextChannelCommand、LastChannelCommand
调用者角色(Invoker) : RemoteControl
五、UML图
六、优缺点
(一)优点
- 通过引入中间件(抽象接口)解耦了请求与实现。
- 扩展方便,增加新命令直接增加一个对象即可。
- 支持命令的组合操作,比较灵活方便。
(二)缺点
- 如果命令过多的时候,会有大量的具体命令类。因为针对每一个命令都需要设计一个具体命令类。
七、命令模式拓展
1.命令队列
- 有时候命令不再是单一的一条命令,而是一系列命令,这样就形成了一个命令队列。命令队列的实现有很多种方式,例如我们可以增加一个“队列”来管理命令。
2.撤销
- 1.是
结合备忘录模式还原最后状态
,该方法适合接收者为状态变更的情况; - 2.是通过
新增一个命令,实现事件回滚
,撤销命令也是一个命令,例如计算机做加法的时候,回滚命令通常就可以设定为加一个相反数实现。
3.记录请求日志
请求日志就是将请求的历史记录保存下来,通常以日志文件的形式永久存储在计算机中。
- 我们可以将 Command 类实现序列化接口,即实现 Serializable 接口。然后在每次执行命令的时候,将该命令写到日志文件中去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了