含义:备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。
优点: 1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2.实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
使用场景: 1.需要保存/恢复数据的相关状态场景。
2.提供一个可回滚的操作。
C#示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Menmentodemo
{
/// <summary>
/// 负责从menmento中恢复对象状态
/// </summary>
public class CareTaker
{
private List<Memento> mementoList = new List<Memento>();
public void add(Memento state)
{
mementoList.Add(state);
}
/// <summary>
/// 恢复对象状态
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Memento get(int index)
{
return mementoList[index];
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Menmentodemo
{
/// <summary>
/// 包含要被恢复对象的状态
/// </summary>
public class Memento
{
private String state;
public Memento(String state)
{
this.state = state;
}
public String getState()
{
return state;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Menmentodemo
{
/// <summary>
/// 创建并在 Memento 对象中存储状态
/// </summary>
public class Originator
{
private String state;
public void setState(String state)
{
this.state = state;
}
public String getState()
{
return state;
}
/// <summary>
/// 备份对象状态
/// </summary>
/// <returns></returns>
public Memento saveStateToMemento()
{
return new Memento(state);
}
/// <summary>
/// 获取对象状态
/// </summary>
/// <param name="Memento"></param>
/// <returns></returns>
public string getStateFromMemento(Memento Memento)
{
state = Memento.getState();
return state;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Menmentodemo
{
public partial class Form1 : Form
{
Originator originator;
CareTaker careTaker;
public Form1()
{
InitializeComponent();
originator = new Originator();
careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Add(originator.getState());
}
private void button2_Click(object sender, EventArgs e)
{
string str = originator.getStateFromMemento(careTaker.get(0));
listBox2.Items.Add(str);
string str1 = originator.getStateFromMemento(careTaker.get(1));
listBox2.Items.Add(str1);
}
}
}