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