跳转至

命令模式

命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化。命令模式也支持队列和日志等功能。

命令模式的特点

  1. 请求发送者与请求接收者解耦:命令对象将请求封装成一个对象,发送者无需知道接收者的具体实现。
  2. 支持撤销和重做:命令对象可以记录请求的历史,支持撤销和重做操作。
  3. 支持队列和日志:可以将命令对象存储在队列中,实现任务调度和日志记录。

命令模式的结构

  1. 命令接口(Command):声明执行命令的方法。
  2. 具体命令(Concrete Command):实现命令接口,将一个接收者对象绑定于一个动作。
  3. 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
  4. 调用者/请求者(Invoker):要求命令对象执行请求。
  5. 客户端(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)

运行结果

Receiver: Handling command

说明

  1. 命令接口(Command):定义了命令对象的执行方法 execute
  2. 具体命令类(ConcreteCommand):实现了命令接口,内部持有一个接收者对象,并在 execute 方法中调用接收者的具体操作。
  3. 接收者类(Receiver):知道如何实施与执行一个请求相关的操作。
  4. 调用者类(Invoker):持有一个命令对象,并在需要时调用命令对象的 execute 方法执行请求。

通过命令模式,客户端可以将请求封装成一个具体的命令对象,发送给调用者执行,从而实现了请求发送者和请求接收者的解耦。命令模式尤其适用于需要支持撤销、重做或者日志记录的场景,例如菜单操作、队列请求等。

评论