跳转至

命令 Command

👫 命令

命令模式是一种设计模式,它尝试以对象来代表实际行动。命令对象可以把行动(action) 及其参数封装起来,于是这些行动可以被: * 重复多次 * 取消(如果该对象有实现的话) * 取消后又再重做 ### 示例:

#!/usr/bin/env python
# encoding: utf-8
"""
命令模式
讲一个请求封装为一个对象, 从而使你可用不同的请求对客户进行参数化
对请求排队或记录请求日志, 以及支持可撤销操作
- 比较容易设计一个命令队列
- 在需要情况下, 可以将命令计入日志
- 允许接受请求的一方决定是否要否决请求
- 可以容易的实现对请求的撤销和崇左
- 由于加紧新的具体命令类不影响其他类,  可以很容易新增
- 把请求一个操作的对象与指导怎么执行一个操作的对象分隔开
"""

from abc import ABCMeta, abstractmethod


class Command(metaclass=ABCMeta):
    """
    声明执行操作的接口
    """

    def __init__(self, receiver):
        self.receiver = receiver

    @abstractmethod
    def execute(self):
        pass


class ConcreteCommand(Command):
    """
    将一个接受着对象绑定于一个动作, 调用接收者相应的操作
    """

    def execute(self):
        self.receiver.action()


class Invoker(object):
    @property
    def command(self):
        return self.__command

    @command.setter
    def command(self, value):
        self.__command = value

    def execute_command(self):
        self.__command.execute()


class Receiver(object):
    def action(self):
        print("execute command")


if __name__ == '__main__':
    r = Receiver()

    cmd = ConcreteCommand(r)

    invoker = Invoker()
    invoker.command = cmd
    invoker.execute_command()