zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    [Leetcode 56] 55 Jump Game
    [Leetcode 57] 61 Rotate List
    [Leetcode 61] 73 Set Matrix Zeros
    [Leetcode 62] 74 Search a 2D Matrix
    [Leetcode 64] 78 Subsets
    [Leetcode 63] 77 Combinations
    [Leetcode 58] 63 Unique Path II
    python学习笔记第1章节 基础知识
    python学习笔记第2章节 分支,循环,还有条件
    visual studio 2008 试用版评估期已结束的解决方法(转载)
  • 原文地址:https://www.cnblogs.com/saville/p/3087657.html
Copyright © 2011-2022 走看看