Skip to content

Latest commit

 

History

History
52 lines (34 loc) · 1.85 KB

File metadata and controls

52 lines (34 loc) · 1.85 KB

命令模式

“命令”模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者)。在《设计模式:可复用面向对象软件的基础》所举的示例中,调用者是图形应用程序中的菜单项,而接收者是被编辑的文档或应用程序自身.

命令模式

这个模式的做法是,在二者之间放一个Command对象,让它实现只有一个方法(execute)的接口,调用接收者中的方法执行所需的操作。这样,调用者无需了解接收者的接口而且不同的接收者可以适应不同的Command子类.调用者有一个具体的命令,通过调用execute 方法执行。注意,中的MacroCommand 可能保存一系列命令,它的execute() 方法会在各个命令上调用相同的方法。

Gamma等人说过:“命令模式是回调机制的面向对象替代品。”问题是,我们需要回调机制的面向对象替代品吗?有时确实需要,但并非始终需要。

我们可以不为调用者提供一个Command实例,而是给它一个函数.此时,调用者不用调用command.execute(),直接调用command()即可。MacroCommand可以实现成定义了__call__方法的类。这样,MacroCommand的实例就是可调用对象,各自维护着一个函数列表,供以后调用.

class MacroCommand:
    """一个执行一组命令的命令"""
    def __init__(self,commands):
        self.commands = list(commands)
    def __call__(self):
        for command in self.commands:
            command()
def command1():
    print("a")
    
def command2():
    print("b")
    
def command3():
    print("c")
mc = MacroCommand([command1,command2,command3])
mc()
a
b
c

python的一等函数特性为命令模式节省了大量的代码,