如何实现回滚?回滚怎么操作?今天我们介绍的设计模式叫做命令模式,在这个模式下,我们可以实现do和undo的解耦,让使用方不用关心内部的实现细节。其实也就是两个功能,一个是发布另外一个是回滚。这两个操作是互相可逆的,对于它的使用者来说,是不会关心它的内部是如何实现的,我们只需要在页面上按按钮就好了。发布之后发现问题,再点击回滚,系统再自动恢复到发布之前的状态。
大家好,欢迎来到设计模式专题。我们的主要目的是介绍一些有趣的设计模式。
我们今天介绍的设计模式叫做命令模式。在这个模式中,我们可以将do和undo解耦,这样用户就不必关心内部的实现细节。
命令模式
我们在日常生活中经常使用这种模式。举个很简单的例子,比如我们发布代码。发布后发现不小心贴了个bug。这时候我们该怎么办?很简单,就是把在线代码回滚到这个版本之前的代码。这样就消除了我们发布带来的变化,进而避免了bug的产生。
那么,一个发布系统需要做什么呢?其实有两个功能,一个是发布,一个是回滚。这两个操作是可逆的。对于它的用户来说,他们不会关心它在内部是如何实现的。我们只需要按下页面上的按钮。
我们来回顾一下这个过程。我们可以通过点击发布在线发布最新的代码。发布后,如果发现问题,点击回滚,系统会自动恢复到发布前的状态。发布和回滚是相互可逆的。当我们消除bug后,再次点击发布,我们就可以再次发布最新的代码了。
命令模式就是它所做的,它是do和undo的封装。让我们看一个非常简单的例子,重命名一个文件。比如我们要给系统里的文件重新命名,从A.txt改成b.txt,这个功能很简单。系统给我们提供了一个现成的函数,叫做os.rename()。我们只需要将文件A和B的地址传入其中。
发现名字改错了想回滚怎么办?会发现我们改之前的名字已经忘记了,不知道怎么回滚。此时可以使用命令模式。让我们看看代码:
在execute方法中,我们将文件从src改为dest,如果要回滚,它会再次调用rename。将文件名从dest回滚到src。这样,作为用户,你完全不用了解api内部的实现逻辑,否则为了防止纠错,你需要做大量的适配。
菜单项
有了命令模式,我们可以在外面封装一层进行ui交互,常见的UI交互模式就是按钮。点击某个按钮后,会出现一个按下的标记,实现什么功能。再次按下标记消失,该功能将被关闭。
我随便找了个例子,比如下面菜单里的显示小地图和显示面包屑。这些都是这样的功能。点按缩略图以出现,然后点按缩略图以消失。
如果你写了一个UI页面,一般来说,我们会先定义一个菜单项类,它代表菜单中所有项的基类。不同的选项表示不同的项目。进一步分析后会发现,有些项的关闭机制需要双击,有些项则不需要。例如,上面的Run和Output项都执行一次。
当然,我们可以直接使用上面介绍的命令对象作为item,但是这样不利于整个菜单的统一,所以我们也会在外面多一层面包。例如,所有MenuItem的父类应该如下所示:
有了这个基类,我们就可以实现一个以command为对象作为类成员变量的rollback类,然后在其中实现unpress方法:
这样,我们的UI就与命令解耦了。如果我们想要实现可以回滚的不同功能,我们只需要实现不同的命令来创建实例。对整个UI的使用没有影响,UI组件使用的所有类都是统一的。可能在Python这种弱类型语言中不明显,因为我们的一个列表说是基类菜单的列表,但是可以加载任何东西。但是如果是强类型语言,那么这种抽象和封装是非常必要的。
今天的文章到此为止。真心祝大家天天有事。如果你还喜欢今天的内容,请来个三重支持~(喜欢,关注,转发)
-结束-
本文源于微信官方账号:TechFlow,求关注。
本文来自网络,不代表「专升本要什么条件_专升本要几年_成人高考专升本_山东专升本信息网」立场,转载请注明出处:http://www.sdzsb8.cn/zsxx/26245.html