设计模式之命令模式
命令模式
将请求和操作封装成对象,将不同请求和其接收者分开解耦来实现请求的发送、执行、撤销等操作。
换句话说就是, 命令模式把 命令内容、命令执行者、调用者或调用时间点分离,实现了请求的发送和执行之间的解耦。
命令模式角色
- command接口类:定义执行命令的方法 execute
- 具体命令类:实现 command接口,实现execute方法,包含一个接收者对象,执行具体的业务逻辑
- invoker类(调用者): 负责发送命令,不关心命令如何执行,只在需要时调用具体命令类的execute方法,通过命令接口与具体命令类对象交互; 比如遥控器
- receiver(接收者):实际执行命令,负责调用命令的执行。 比如 电视机
- client(客户端)
命令模式优缺点
优点:
- 解耦发送者和接收者
- 支持日志记录和撤销操作: 命令被封装成对象、可以记录命令的历史,支持撤销和重做操作
- 支持队列和异步执:命令可以被添加到队列中,延迟执行,或者在不同的线程中执行
缺点:
- 增加了系统的复杂性
- 过度使用可能导致性能问题: 命令过于细粒度,可能会增加系统的开销。
命令模式的应用场景
- GUI用户界面,将按钮点击事件等分装成命令,传给相应的处理程序,如 pyqt信号和槽
- 事务处理系统: 命令可以被记录下来,支持事务的回滚和重做
- 脚本和宏: 命令可以被记录下来,形成一个脚本,供后续执行。 如使用shell脚本将多个命令封装,并提供给crontab定时任务调用; django中的 BaseCommand类。还有批处理系统将多个命令组合成宏命令批量执行。
- 游戏开发领域: 将玩家的按键操作命令记录下来,供后续回放
# 接口类
class Command:def execute(self):pass# 具体命令类
class TvTurnOnCommand(Command):def __init__(self, tv):self.tv = tvdef execute(self):self.tv.turn_on()class TvTurnOffCommand(Command):def __init__(self, tv):self.tv = tvdef execute(self):self.tv.turn_off()# 接收者类(如电视机)
class Tv:def turn_on(self):print("打开电视")def turn_off(self):print("关闭电视")# 调用者类(如万能遥控器)
class RemeteCtrl:def __init__(self):self.commands = []def _add_command(self, command):self.commands.append(command)def revoke(self):"返回按钮"self.commands.pop()if self.commands:self.commands[-1].execute()def press_button(self, command):self._add_command(command)self.command.execute()# 客户端
tv = TV() # 创维、海信、小米..等任何品牌的电视机# 命令主体
turn_on_command = TvTurnOnCommand(tv)
turn_off_command = TvTurnOffCommand(tv)# 遥控器发送命令,只管把命令发送出去
remote_ctrl = RemoteCtrl()
remote_ctrl.press_button(turn_on_command)
remote_ctrl.press_button(turn_off_command)