【设计模式】GoF设计模式之备忘录模式(Memento Pattern)

设计模式之备忘录模式 Memento Pattern

V1.0

核心概念

备忘录模式的核心是定义一个备忘录类(Memento),这个类的实例能够表示发起人类(Originator)的一种状态。发起人类提供生成备忘录对象的接口,以保存其当时的状态,也提供了接口传入备忘录实例,能够使用备忘录对象实例中保存的信息恢复其保存时的状态。

角色

  • 发起人(Originator):具体的业务类,提供生成备忘录的接口,也提供使用备忘录对象来恢复状态的接口。
  • 备忘录(Memento):由发起人根据其状态创建,保存了发起人创建时的状态信息,之后可以用来恢复发起人的状态。
  • 管理者(Caretaker):用于保存备忘录对象,以及在向其查询时提供备忘录对象。

代码示例

csharp 复制代码
using System;
using System.ComponentModel;

public class Originator
{
    private string _state = null;

    public string state
    {
        get => _state;
        set => _state = value;
    }

    public Memento createMemento()
    {
        return new Memento(state);
    }

    public void setState(string state)
    {
        this.state = state;
    }

    public void recoverFromMemento(Memento m)
    {
        state = m.state;
        Console.WriteLine($"The state of the originator is restored to '{state}'");
    }

    public void displayState()
    {
        Console.WriteLine($"The state of the originator now: {state}");
    }
};


public class Memento
{
    private string _state;

    public string state
    {
        get => _state;
        set => _state = value;
    }

    public Memento(string state)
    {
        this.state = state;
    }

};

public class Caretaker
{
    private List<Memento> list = new();

    public void addMemento(Memento m)
    {
        list.Add(m);
    }

    public Memento getMemento(int index)
    {
        return list.Count > index ? list[index] : null;
    }
}

public class Program
{
    public static void Main(string[] arg)
    {
        //创建发起人和管理者
        Originator o = new();
        Caretaker ct = new();

        //设置发起人的状态,展示并保存为Memento对象到管理者
        o.setState("Idle");
        o.displayState();

        ct.addMemento(o.createMemento());

        //设置发起人的状态,展示并保存为Memento对象到管理者
        o.setState("Working");
        o.displayState();

        ct.addMemento(o.createMemento());

        //设置发起人的状态,展示并保存为Memento对象到管理者
        o.setState("Stop");
        o.displayState();

        ct.addMemento(o.createMemento());

        //恢复Originator的状态到Idle状态
        o.recoverFromMemento(ct.getMemento(0));
        o.displayState();

        //恢复Originator的状态到Working状态
        o.recoverFromMemento(ct.getMemento(1));
        o.displayState();

    }
}

程序运行结果

复制代码
The state of the originator now: Idle
The state of the originator now: Working
The state of the originator now: Stop
The state of the originator is restored to 'Idle'
The state of the originator now: Idle
The state of the originator is restored to 'Working'
The state of the originator now: Working

代码讲解

  • Originator类

    在这段代码中,Originator类的state属性是Originator类的状态,Originator类也提供了创建备忘录对象的createMemento方法,从备忘录对象中恢复状态的recoverFromMemento方法,以及展示Originator类当前状态的方法displayState。

  • Memento类

    Memento类中的state属性用来保存对应的Originator的状态,在Originator恢复状态时要用到。

  • Caretaker类

    Caretaker类定义了private访问权限的list列表,用于保存Memento对象,提供了addMemento方法用来向list列表中新增Memento对象,以及getMemento方法用于从list列表中获取指定序号的Memento对象。

  • Program类

    Main函数中创建了发起人和管理者,变更发起人的状态,以及展示并保存Memento对象,之后从管理者中获取Memento对象,以恢复发起人的状态。

适用场景

备忘录模式可以用来保存快照的场景中,例如程序或者虚拟机的快照。

备忘录模式也可以用在撤销或恢复状态的场景中,通过保存当前的状态,在撤消操作时可以使用备忘录对象恢复之前的状态。

相关推荐
Zane19942 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫3 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19943 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19944 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..5 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1505 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)6 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki6 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅666 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa6 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio