简介:
备忘录模式的意图是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
可使用数据回滚,恢复先前状态。
介绍:
优点 | 1.将数据恢复成原来正确的数据,配合文件、数据库等存储方式。 2.备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理,符合“单一职责”原则。 3.将数据状态恢复到某个特定的步骤。 |
缺点 | 1.如需要多个备份,对资源消耗过大。 2.所备份的内存不知。 |
特点 | 1.备忘录(Memento)存储原发器(Originator)对象的内部状态。适用于“由原发器管理,却又必须存储在原发器之外的信息”。 2.为了符合“迪米特原则”,还要增加一个管理备忘录的类。 |
发起人角色(Originator) | 负责创建和恢复备忘录数据,负责创建一个返回备忘录实例的方法。 |
备忘录角色(Memento) | 负责存储发起人对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。 |
管理者角色(Caretaker) | 负责保存备忘录对象,不能对备忘录的内容进行访问或者操作。 |
Memento模式和Command模式有些类似。Memento备忘录模式和Command命令模式其实还是有些细微的差别的。虽然两者都支持Undo操作,但是Command是对行为的封装,Memento是对对象状态的保留,这是目的上的不同。它们支持的也是Undo操作的不同层面,Command是对行为序列的操作,Memento是对行为状态的操作。命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式保存的是发起人的状态(而状态对应的数据结构,如属性)。
使用:
本案例的意思是存储手机通讯录。
//Data
public sealed class AdressList
{
public string Name;
public string Mobile;
}
//Originator
public sealed class Originator
{
public List<AdressList> _list;
public Originator(List<AdressList> list)
{
if (list != null)
{
_list = list;
}
}
//create
public Memento CreateMemento()
{
return new Memento(new List<AdressList>(_list));
}
//restore
public void RestoreMemento(Memento memento)
{
_list = memento._list;
}
public void Show()
{
foreach (var person in _list)
{
}
}
}
//Memento
public sealed class Memento
{
public List<AdressList> _list { get; private set; }
public Memento(List<AdressList> list)
{
_list = list;
}
}
//Caretaker
public sealed class MementoManger
{
public Memento memento;
}
//备忘录模式调用
//数据
List<AdressList> list = new List<AdressList>()
{
new AdressList() {Name = "Jordon", Mobile = "1"},
new AdressList() {Name = "Yao Ming", Mobile = "2"},
};
//显示
Originator listOrigin = new Originator(list);
listOrigin.Show();
//创建备忘录
MementoManger manager = new MementoManger();
manager.memento = listOrigin.CreateMemento();
//更改
listOrigin._list.RemoveAt(0);
listOrigin.Show();
//恢复
listOrigin.RestoreMemento(manager.memento);
listOrigin.Show();