欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解析C#设计模式编程中备忘录模式的运用

程序员文章站 2023-02-22 20:47:20
一、概述 在软件开发中,有时需要保存一个对象的状态,以便于允许用户取消相关操作或者从以往的状态中恢复过来。比如一个文档版本管理系统,可以根据需要将指定文档恢复到之前保存过...

一、概述

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

二、备忘录模式

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

解析C#设计模式编程中备忘录模式的运用

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撤销操作的实现,数据库中事务操作。

五、备忘录模式的优缺点

备忘录模式具有以下优点:

如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。

备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。

当然,备忘录模式也存在一定的缺点:

在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。

六、总结

备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原来状态时,再从备忘录对象中进行获取,在实际开发过程也应用到这点,例如数据库中的事务处理。