python设计模式之命名模式
意图
- 将请求封装成一个对象,从而使你可用不同的请求对客户端进行进行参数化,对请求排队或记录请求日志,以及支持可撤销的动作
解决的问题
- 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适
适用性
- 当需要对行为进行“记录、撤销/重做”等处理时
- 系统需要将请求者和接收者解耦,使得调用者和接收者不直接交互
- 系统需要在不同时间指定请求、请求排队和执行请求
- 系统需要将一组操作组合在一起,即支持宏命令
- 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。
例子
# -*- coding=utf-8 -*-
import os
class MoveFileCommand(object):
def __init__(self, src, dest):
self.src = src
self.dest = dest
def execute(self):
self()
def __call__(self):
print('renaming {} to {}'.format(self.src, self.dest))
os.rename(self.src, self.dest)
def undo(self):
print('renaming {} to {}'.format(self.dest, self.src))
os.rename(self.dest, self.src)
if __name__ == "__main__":
command_stack = list()
command_stack.append(MoveFileCommand('foo.txt', 'bar.txt'))
command_stack.append(MoveFileCommand('bar.txt', 'baz.txt'))
for cmd in command_stack:
cmd.execute()
for cmd in reversed(command_stack):
cmd.undo()
# 输出:
renaming foo.txt to bar.txt
renaming bar.txt to baz.txt
renaming baz.txt to bar.txt
renaming bar.txt to foo.txt