跳到主要内容

21、Python - 命令模式

基本介绍

命令模式(Command Pattern)是一种数据驱动的设计模式,它将请求以命令的形式包裹在对象中,并传给调用对象。

调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

特点:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化

该模式属于行为型模式。

案例图示

命令模式应该有一下几个角色:

1)Command:

  • 定义命令的接口,声明执行的方法,可以理解为一个基类。

2)ConcreteCommand:

  • 命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

3)Receiver:

  • 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

4)Invoker:

  • 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象,相当于使用命令对象的入口。

5)Client:

  • 创建具体的命令对象,组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。

 

优缺点

优点:

  • 降低了系统耦合度
  • 新的命令可以很容易添加到系统中去

缺点:

  • 使用命令模式可能会导致某些系统有过多的具体命令类

代码实现

用Python实现命令模式:

class Command:
    """声明命令模式接口"""

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

    def execute(self):
        pass
class ConcreteCommand(Command):
    """实现命令模式接口"""

    def execute(self):
        self.obj.run()
class Invoker:
    """接受命令并执行命令的接口"""

    def __init__(self):
        self._commands = []

    def add_command(self, cmd):
        self._commands.append(cmd)

    def remove_command(self, cmd):
        self._commands.remove(cmd)

    def run_command(self):
        for cmd in self._commands:
            cmd.execute()
class Receiver:
    """具体动作"""

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

    def run(self):
        print(self.word)
def client():
    """装配者"""
    test = Invoker()
    cmd1 = ConcreteCommand(Receiver('命令一'))
    test.add_command(cmd1)
    cmd2 = ConcreteCommand(Receiver('命令二'))
    test.add_command(cmd2)
    cmd3 = ConcreteCommand(Receiver('命令三'))
    test.add_command(cmd3)
    test.run_command()
if __name__ == '__main__':
    client()

# 命令一
# 命令二
# 命令三