定义
命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
模式结构
client 负责创建一个ConcreteCommand,并设置接受者
ConcreteCommand 定义了动作和接受者之间的绑定关系
Receiver 接受者,action实现接受者自己的动作
Command 命令对象接口,实现该接口只需要实现 execute() 和 undo()
Invoker 调用者持有命令对象,只要调用命令对象的 execute() 方法即可将请求执行
模式分析
命令模式的本质是将请求进行封装,将命令的发出责任和命令的执行责任分开。
请求者发出请求,要求执行一个动作,接受者收到请求,并执行一个动作。
请求者并不知道接受者是谁,也不知道接受者如何收到请求并执行请求。
代码实现
class Command(object)
def __init__(self, receiver):
self.receiver = receiver
def execute(self):
raise NotImplementedError
def undo(self):
raise NotImplementedError
class ConcreteCommand(Command):
def execute(self):
self.receiver.action()
def undo(self):
self.receiver.reverse()
class Receiver(object):
def action(self):
raise NotImplementedError
def reverse(self):
raise NotImplementedError
class ConcreteReceiver(Receiver):
def action(self):
print('action concreate receiver.')
def reverse(self):
print('action reverse')
class Invoker(object):
undo_command = None
def set_command(self, command):
self.command = command
def execute_command(self):
self.command.execute()
self.undo_command = self.command
def undo(self):
self.undo_command.undo()
def main():
receiver = ConcreteReceiver()
command = ConcreteCommand(receiver)
invoker = Invoker()
invoker.set_command(command)
invoker.execute_command()
invoker.undo()
适用性
- 系统需要将请求调用者和请求接受者之间解耦
- 系统需要在不同的时间指定请求,将请求排队和执行请求
- 系统需要支持命令的撤销操作