命令模式
命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化。命令模式也支持队列和日志等功能。
命令模式的特点
- 请求发送者与请求接收者解耦:命令对象将请求封装成一个对象,发送者无需知道接收者的具体实现。
- 支持撤销和重做:命令对象可以记录请求的历史,支持撤销和重做操作。
- 支持队列和日志:可以将命令对象存储在队列中,实现任务调度和日志记录。
命令模式的结构
- 命令接口(Command):声明执行命令的方法。
- 具体命令(Concrete Command):实现命令接口,将一个接收者对象绑定于一个动作。
- 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
- 调用者/请求者(Invoker):要求命令对象执行请求。
- 客户端(Client):创建具体命令对象并设定它的接收者。
命令模式的Python实现
以下是命令模式在Python中的一个简单实现示例:
1. 定义命令接口和具体命令类
from abc import ABC, abstractmethod
# 命令接口
class Command(ABC):
@abstractmethod
def execute(self):
pass
# 具体命令类
class ConcreteCommand(Command):
def __init__(self, receiver):
self._receiver = receiver
def execute(self):
return self._receiver.action()
# 接收者类
class Receiver:
def action(self):
return "Receiver: Handling command"
2. 定义调用者类
# 调用者类
class Invoker:
def __init__(self):
self._command = None
def set_command(self, command):
self._command = command
def execute_command(self):
if self._command:
return self._command.execute()
else:
return "Invoker: No command set"
3. 客户端代码
if __name__ == "__main__":
receiver = Receiver()
command = ConcreteCommand(receiver)
invoker = Invoker()
invoker.set_command(command)
result = invoker.execute_command()
print(result)
运行结果
说明
- 命令接口(Command):定义了命令对象的执行方法
execute
。 - 具体命令类(ConcreteCommand):实现了命令接口,内部持有一个接收者对象,并在
execute
方法中调用接收者的具体操作。 - 接收者类(Receiver):知道如何实施与执行一个请求相关的操作。
- 调用者类(Invoker):持有一个命令对象,并在需要时调用命令对象的
execute
方法执行请求。
通过命令模式,客户端可以将请求封装成一个具体的命令对象,发送给调用者执行,从而实现了请求发送者和请求接收者的解耦。命令模式尤其适用于需要支持撤销、重做或者日志记录的场景,例如菜单操作、队列请求等。