在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以把该对象恢复到原先的状态。
发起人角色:记录当前时刻的内部状态,负责创建和恢复备忘录数据。
备忘录角色:负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态。
管理者角色:负责保存备忘录对象。
public class Person
{
public string name { get; set; }
public string sex { get; set; }
}
public class PersonOperate
{
public List<Person> personList { get; set; }
public PersonOperate(List<Person> persons)
{
personList = persons;
}
public ContentMemento CreateMemnto()
{
// 这里也应该传递深拷贝,new List方式传递的是浅拷贝,
// 因为ContactPerson类中都是string类型,所以这里new list方式对ContactPerson对象执行了深拷贝
// 如果ContactPerson包括非string的引用类型就会有问题,所以这里也应该用序列化传递深拷贝
return new ContentMemento(new List<Person>(personList));
}
public void RestoreMento(ContentMemento memento)
{
this.personList = memento.personList;
}
public void show()
{
Console.WriteLine("联系人列表中有{0}个人,他们是:", this.personList.Count);
foreach (var item in personList)
{
Console.WriteLine("姓名: {0} 号码为: {1}", item.name, item.sex);
}
}
}
public class ContentMemento
{
public List<Person> personList;
public ContentMemento(List<Person> persons)
{
personList = persons;
}
}
public class Mananger
{
public ContentMemento memnto { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Person> persons = new List<Person>
{
new Person() { name="aaa",sex="男" },
new Person() { name="bb",sex="女" },
new Person() { name="cc",sex="男" },
new Person() { name="dd",sex="女" }
};
PersonOperate op = new PersonOperate(persons);
op.show();
Mananger manager = new Mananger();
manager.memnto = op.CreateMemnto();
persons.RemoveAt(1);
op.show();
op.RestoreMento(manager.memnto);
op.show();
Console.Read();
}
优点:
如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。
缺点:
在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。