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中,便于某一时刻快读提取指定的数据结构,恢复某一对象在其指定时期的状态。