时间:2021-05-19
一、概述
在软件开发中,有时需要保存一个对象的状态,以便于允许用户取消相关操作或者从以往的状态中恢复过来。比如一个文档版本管理系统,可以根据需要将指定文档恢复到之前保存过的任意一个状态。这时就可以通过备忘录模式来实现。
二、备忘录模式
备忘录模式可以在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。其结构图如下:
Memento用于保存Originator对象的内部状态。
Originator创建Memento,并根据需要决定需要在Memento中保存那些状态,同时还能从Memento中恢复内部状态。
Caretaker负责保存Memento对象,但不对Memento对象进行任何操作。
备忘录模式用来保存与对象有关的数据,这样可以在将来对对象进行复原。例如在绘图程序中需要保存对象的颜色尺寸等。
三、示例
我们我们就以文档版本管理系统为例来介绍备忘录模式。
首先定义Originator,在这里就是文档本身。
public class Document { public string Content { get; set; } public DocumentVersion CreateMemento() { return new DocumentVersion( Content); } public void SetMemento(DocumentVersion documentVersion) { Content = documentVersion.Content; } }接着定义Memento。
public class DocumentVersion { public string Content { get; set; } public DocumentVersion(string content) { Content = content; } }最后定义Caretaker,通过一个Dictionary容器保存Memento。
public class Caretaker { private Dictionary<int, DocumentVersion> _mementoList = new Dictionary<int, DocumentVersion>(); public DocumentVersion GetDocumentVersion(int versionID) { return _mementoList[versionID]; } public void AddDocumentVersion(DocumentVersion documentVersion) { int maxVersionID = _mementoList.Keys.Count == 0 ? 0: _mementoList.Keys.Max(); _mementoList.Add(maxVersionID + 1, documentVersion); } }四、备忘录模式的适用场景
在以下情况下可以考虑使用备忘录模式:
如果系统需要提供回滚操作时,使用备忘录模式非常合适。例如文本编辑器的Ctrl+Z撤销操作的实现,数据库中事务操作。
五、备忘录模式的优缺点
备忘录模式具有以下优点:
如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。
当然,备忘录模式也存在一定的缺点:
在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。
六、总结
备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原来状态时,再从备忘录对象中进行获取,在实际开发过程也应用到这点,例如数据库中的事务处理。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文以一个简单实例讲述了C#备忘录模式(MementoPattern)的实现方法。分享给大家供大家参考。具体实现方法如下:简单来说,备忘录模式就是支持回退操作。
本文实例讲述了Python设计模式之备忘录模式原理与用法。分享给大家供大家参考,具体如下:备忘录模式(MementoPattern):不破坏封装性的前提下捕获一
备忘录模式。顾名思义,备忘录模式的初衷就是为了返回上一个状态而设计的。从名字看起来一目了然,好吧,还是老样子,先给出定义。备忘录(Memento):在不破坏封装
定义与结构 备忘录(Memento)模式又称标记(Token)模式。GOF给备忘录模式的定义为:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保
备忘录模式旨在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。在命令模式中,备忘录模式经常还