【设计模式】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对象,以恢复发起人的状态。

适用场景

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

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

相关推荐
晨米酱15 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机20 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机21 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机21 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机21 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式