第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    # 由于读文件没有撤销,我们这里进行捕捉

输出结果:

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++ & Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务