第9篇---Python设计模式之命令模式+含代码实现+学习python的赶快进
命令模式概念:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。。 好难理解哦!!!我用例子将一下吧。 比如创建/撤销文件命令,我们可以为其创建一个类,用这个命令时,相当于给这个命令实例化。。 想让其支持撤销操作,不就是这个类中加入一个撤销的方法。这个类中肯定也有创建的方法,不用多讲吧。下面我们通过案例一详谈。
案例一:
我们总共设置四个命令: 创建文件(支持撤销), 读文件(不支持撤销), 重命名文件(支持撤销),删除文件(不支持撤销)。。 创建文件的撤销不就是删除文件。。重命名文件的撤销就是反过来重命名。。里面的verbase只是为了让控制台输出一些内容,以便我们观察。让不需要,直接将verbase=False。。还有最后main方法中,我们将几个命令放在列表中,直接从头到尾执行一遍,并且提供了逆转执行(也就是从尾到头,执行的是撤销操作)。。因为读没有撤销,我们捕捉异常,什么也不做就行了。
import os
verbose = True
class RenameFile:
'''
重命名文件
这里我们支持撤销操作
'''
def __init__(self, path_src, path_dest):
self.src, self.dest = path_src, path_dest # 一个源文件,一个是重命名
def execute(self): # 重命名
if verbose: # 这里我们只是为了后面有个输出,以示意我们这一步是干什么的,若不想看见输出,可将verbase=False
print('将文件{}重命名为{}'.format(self.src, self.dest))
os.rename(self.src, self.dest) # 这个才是真正的重命名
def undo(self): # 撤销重命名
if verbose:
print("撤销重命名中。。。。")
os.rename(self.dest, self.src) # 这一步撤销就相当于又进行重命名,只不过参数刚好相反
class CreateFile:
'''
创建文件
这里我们支持撤销操作
'''
def __init__(self, path, txt='Hello World!!!'):
self.path, self.txt = path, txt # 文件, 内容
def execute(self):
if verbose:
print("正在创建文件:{}".format(self.path))
with open(self.path, mode='w', encoding='utf-8') as out_file:
out_file.write(self.txt)
def undo(self): # 创建的撤销就是删除
delete_file(self.path)
class ReadFile:
def __init__(self, path):
self.path = path
def execute(self):
if verbose:
print("正在读文件:{}".format(self.path))
with open(self.path, mode='r', encoding='utf-8') as in_file:
print(in_file.read(), end='') # 打印读出来的内容
def delete_file(path):
if verbose:
print("正在删除文件")
os.remove(path)
if __name__ == '__main__':
origin_name, new_name = 'file1', 'file2'
commands = []
for cmd in CreateFile(origin_name), ReadFile(origin_name), RenameFile(origin_name, new_name):
commands.append(cmd) # 把这一组命令全加到列表中
[c.execute() for c in commands]
answer = input('想逆转以上的命令吗?[y/n]')
if answer not in 'Yy':
print("最后结果是:", new_name)
exit()
for c in reversed(commands):
try:
c.undo()
except AttributeError as e:
pass # 由于读文件没有撤销,我们这里进行捕捉
输出结果: