一、概述
在软件开发中,有时需要保存一个对象的状态,以便于允许用户取消相关操作或者从以往的状态中恢复过来。比如一个文档版本管理系统,可以根据需要将指定文档恢复到之前保存过的任意一个状态。这时就可以通过备忘录模式来实现。
二、备忘录模式
备忘录模式可以在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。其结构图如下:
Memento用于保存Originator对象的内部状态。
Originator创建Memento,并根据需要决定需要在Memento中保存那些状态,同时还能从Memento中恢复内部状态。
Caretaker负责保存Memento对象,但不对Memento对象进行任何操作。
三、示例
我们我们就以文档版本管理系统为例来介绍备忘录模式。
首先定义Originator,在这里就是文档本身。
1 public class Document 2 { 3 public string Content { get; set; } 4 5 public DocumentVersion CreateMemento() 6 { 7 return new DocumentVersion( Content); 8 } 9 10 public void SetMemento(DocumentVersion documentVersion) 11 { 12 Content = documentVersion.Content; 13 } 14 }
接着定义Memento。
1 public class DocumentVersion 2 { 3 public string Content { get; set; } 4 5 public DocumentVersion(string content) 6 { 7 Content = content; 8 } 9 }
最后定义Caretaker,通过一个Dictionary容器保存Memento。
1 public class Caretaker 2 { 3 private Dictionary<int, DocumentVersion> _mementoList = new Dictionary<int, DocumentVersion>(); 4 5 public DocumentVersion GetDocumentVersion(int versionID) 6 { 7 return _mementoList[versionID]; 8 } 9 10 public void AddDocumentVersion(DocumentVersion documentVersion) 11 { 12 int maxVersionID = _mementoList.Keys.Count == 0 ? 0: _mementoList.Keys.Max(); 13 _mementoList.Add(maxVersionID + 1, documentVersion); 14 } 15 }