• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

05月
05
C#
设计模式

设计模式-备忘录模式

发表于 2022-05-05 • 字数统计 2082 • 被 1,908 人看爆

定义

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态。

备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前在很多软件所提供的撤销(Undo)操作中就使用了备忘录模式。

举例

电脑上常见的撤销(ctrl+z)功能,备忘录模式的功能

结构

备忘录模式结构图.png

实现

class Originstor
{
    //需要保存的属性
    private string state;       
    public string State
    {
        get { return state; }
        set { state = value; }
    }

    //创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象
    public Memento CreateMemento()
    {
        return (new Memento(state));
    }

    //恢复备忘录,将Memento导入并将相关数据恢复
    public void SetMemento(Memento memento)
    {
        state = memento.State;
    }

    //显示数据
    public void Show()
    {
        Console.WriteLine("State=" + state);
    }
}


//备忘录类
class Memento
{
    private string state;

    //导入数据
    public Memento(string state)
    {
        this.state = state;
    }

    //需要保存的数据属性,可多个
    public string State
    {
        get { return state; }
    }
}

class Caretaker
{
    private Memento memento;

    //得到或设置备忘录
    public Memento Memento
    {
        get { return memento; }
        set { memento = value; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        Originstor o = new Originstor();
        o.State = "On";     //设置初始状态属性为"On"
        o.Show();

        Caretaker c = new Caretaker();
        //保存状态时,由于有了很好的封装,可以隐藏Originator的实现细节
        c.Memento = o.CreateMemento();

        o.State = "Off";
        o.Show();       //改变状态属性

        o.SetMemento(c.Memento);
        o.Show();       //恢复初始状态

    }
}

优点

  • (1)备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。
  • (2)备忘录模式实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象,可以实现多次撤销操作。

缺点

备忘录模式资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免地需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。

适用环境

  • (1)保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时能够恢复到先前的状态,实现撤销操作。
  • (2)防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。
分享到:
设计模式-观察者模式
设计模式-中介者模式
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,730次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图