命令模式概念:

       将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。。 好难理解哦!!!我用例子将一下吧。 比如创建/撤销文件命令,我们可以为其创建一个类,用这个命令时,相当于给这个命令实例化。。 想让其支持撤销操作,不就是这个类中加入一个撤销的方法。这个类中肯定也有创建的方法,不用多讲吧。下面我们通过案例一详谈。

案例一:

       我们总共设置四个命令: 创建文件(支持撤销), 读文件(不支持撤销), 重命名文件(支持撤销),删除文件(不支持撤销)。。 创建文件的撤销不就是删除文件。。重命名文件的撤销就是反过来重命名。。里面的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    # 由于读文件没有撤销,我们这里进行捕捉

输出结果: