3-6设计模式之备忘录模式(Memento)

3.6.1 模式意图:

可以保存某个对象在一个或多个时段的状态,不破坏其对象的封装性,方便以后对其恢复(类似版本控制器),如果遇到以上需求,可以使用备忘录模式。

3.6.2 模式概念:

它属于行为型模式,保存一个对象的某个状态,以便在适当的时候恢复对象。

3.6.3 模式元素:

  • 版本的持有者(Caretaker):
  • 版本对应的数据结构(Memento):
  • 版本数据应用者(Originator):

3.6.4 代码示例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Custom.Log;

public class Originator
{
    private string state;
    public string State
    {
        get { return state; }
        set { state = value; }
    }

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

    public void SetMemento(Memento memento)
    {
        state = memento.State;
    }

    public void Show()
    {
        this.Log("State=" + state);
    }
}

public class Memento
{
    private string state;

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

    public string State
    {
        get { return state; }
    }
}

public class Caretaker
{
    public Dictionary<string, Memento> keyValuePairs = new Dictionary<string, Memento>();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Custom.Log;
public class MementoConponent : MonoBehaviour
{
    void Start()
    {
        Originator originator = new Originator();
        originator.State = "On";
        originator.Show();

        Caretaker caretaker = new Caretaker();
        caretaker.keyValuePairs.Add("版本1", originator.CreateMemento());

        originator.State = "Off";
        originator.Show();

        originator.SetMemento(caretaker.keyValuePairs["版本1"]);
        originator.Show();
    }
}

3.6.5 写法对比:

3.6.6 模式分析:

提供了一种可以恢复状态的手段,调用者可以比较方便地回到某个历史的状态,实现了数据的封装,调用者可以不需要关心状态的保存细节。但也有需要注意的地方,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

3.6.7 应用场景:

需要保存对象指定时期的状态或者需要提供版本控制的需求。

3.6.8 小结:

通过封装指定的数据结构,将其对象保存在对应的HashMap中,便于某一时刻快读提取指定的数据结构,恢复某一对象在其指定时期的状态。


更多设计模式详见:设计模式全家桶

发表评论