saville

博客园 首页 新随笔 联系 订阅 管理

一、概述

在软件开发中,有时需要保存一个对象的状态,以便于允许用户取消相关操作或者从以往的状态中恢复过来。比如一个文档版本管理系统,可以根据需要将指定文档恢复到之前保存过的任意一个状态。这时就可以通过备忘录模式来实现。

二、备忘录模式

备忘录模式可以在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。其结构图如下:

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     }

 

posted on 2013-05-19 21:52  saville  阅读(1662)  评论(1编辑  收藏  举报