zl程序教程

您现在的位置是:首页 >  其他

当前栏目

16.设计模式--备忘录模式(Memento模式)

2023-03-15 21:59:24 时间

1.定义

备忘录模式也是一种行为型模式,主要用于捕获一个对象的内部状态,以便在将来的某个时候恢复此状态。

在使用文本编辑器的时候,我们可以对内容进行新增、删除、编辑等处理,由于可能人为操作问题出现错误操作这个时候就有了撤销功能。实际上就是在将来的耨个时候恢复此状态。

2.备忘录模式结构图

TextEdit定义为文档编辑器,其中引用了TextEditMemento用于记录之前的状态,同时拥有自己的方法编辑、保存(只是方便记录状态而抽出来的方法,并不是对整个文档进行保存)、追加、撤销等方法。

TextEditMemento就是备忘录,其中使用了Stack栈来记录状态,而undo则是撤销功能,save用于记录状态。

3.备忘录模式实现

TextEdit中,对追加和更新文本内容的方法都会调用TextEditMemento的保存方法,用于记录状态值,方便后续的撤销动作。

TextEditMemento中使用Stack栈,用于记录之前的状态,首先撤销的逻辑就是类似于栈,先进后出。先做的步骤一般要撤销几次才能撤销回去,所以采用栈。

下面对文档进行一个测试,尝试对文档进行追加文字以及撤销等动作。实际效果如下所示。

备忘录模式存在的意义

从代码来看备忘录模式似乎没有任何意义,如果单纯的只是保存一个状态值,实际上在TextEdit中也能做,但是实际上如果在TextEdit中做了,那么就违背了单一职责原则。TextEdit应该只是负责文本的编辑、更新等操作,而至于记录快照等都应该是TextEditMemento来处理。

如果将来需要在TextEdit中增加新功能,例如清空操作,虽然只是加一个方法,但是实际上TextEdit已经发生了变化,如果使用备忘录模式是不需要管TextEditMemento的。如果写在一起此时如果测试需要测试代码,那么整个功能都是需要进行测试的,原因是即使你只改了TextEdit,但是实际上这两个功能是包含在一起的。

参考文献《图解设计模式》

代码获取地址:https://gitee.com/bughong/design-pattern