清醒疯子 2018-04-08
一、产生背景
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
二、实现方式
三、实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MementoPattern
{
//备忘录模式
class Program
{
static void Main(string[] args)
{
Originator o = new Originator();
o.State = "On";
Caretaker c = new Caretaker();
c.Memento = o.CreateMemento();
o.State = "Off";
o.SetMemento(c.Memento);
Console.ReadLine();
}
}
public class Memento
{
private string _state;
public Memento(string state)
{
this._state = state;
}
public string State
{
get { return _state; }
}
}
public class Originator
{
private string _state;
public string State
{
get
{
return _state;
}
set
{
_state = value;
Console.WriteLine("State = " + _state);
}
}
public Memento CreateMemento()
{
return (new Memento(_state));
}
public void SetMemento(Memento memento)
{
Console.WriteLine("Restoring state...");
State = memento.State;
}
}
public class Caretaker
{
private Memento _memento;
public Memento Memento
{
get
{
return _memento;
}
set
{
_memento = value;
}
}
}
}四、模式分析
优点:1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。