C#设计模式——备忘录模式(Memento Pattern)

一、概述

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

二、备忘录模式

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

C#设计模式——备忘录模式(Memento Pattern)

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     }

 

你可能感兴趣的:(Pattern)