leg*_*esh 23 python oop design-patterns
我正在寻找Python中的Command模式实现...(根据维基百科,
命令模式是一种设计模式,其中一个对象用于表示和封装稍后调用方法所需的所有信息.
)
我发现的唯一一件事就是Command Dispatch 模式:
class Dispatcher:
    def do_get(self): ...
    def do_put(self): ...
    def error(self): ...
    def dispatch(self, command):
        mname = 'do_' + command
        if hasattr(self, mname):
            method = getattr(self, mname)
            method()
        else:
            self.error()
可能是我错了,但看起来这是两个不同的概念,它们偶然会有相似的名字.
我错过了什么吗?
Ant*_*sma 57
最简单的命令模式已经内置到Python中,只需使用一个可调用的:
def greet(who):
    print "Hello %s" % who
greet_command = lambda: greet("World")
# pass the callable around, and invoke it later
greet_command()
如果您的命令需要能够执行的不仅仅是调用,那么命令模式作为面向对象的设计模式会更有意义.常见用例是指您需要能够撤消/重做您的操作.然后命令类是将前向和后向动作结合在一起的好方法.例如:
class MoveFileCommand(object):
    def __init__(self, src, dest):
        self.src = src
        self.dest = dest
        os.rename(self.src, self.dest)
    def undo(self):
        os.rename(self.dest, self.src)
undo_stack = []
undo_stack.append(MoveFileCommand('foo.txt', 'bar.txt'))
undo_stack.append(MoveFileCommand('bar.txt', 'baz.txt'))
# foo.txt is now renamed to baz.txt
undo_stack.pop().undo() # Now it's bar.txt
undo_stack.pop().undo() # and back to foo.txt
是的,您确实错过了一些东西:命令模式仅在没有函数指针(或函数作为第一类对象)的语言中才是必需的,例如 Java。在将函数作为对象的语言中,您可以使用函数本身;不需要有一个单独的命令对象(然后应该有一个“doit”方法)。
在示例中,您可以引用,getattr()调用为您提供“命令对象”(即绑定方法);在它“调用”(即调用)命令对象之后添加括号。