一 概要
1.1 行为型模式
- 特别关注对象之间的通信。描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
1.2 定义
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
二 UML类图
三 例子
static void Main(string[] args)
{
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
caretaker.memento = originator.CreateMemento();
originator.RecoverMemento(caretaker.memento);
}
public class Memento
{
public int hp;
public int mp;
}
public class Originator
{
public int hp;
public int mp;
public void RecoverMemento(Memento memento)
{
this.hp = memento.hp;
this.mp = memento.mp;
}
public Memento CreateMemento()
{
Memento memento = new Memento();
memento.hp = hp;
memento.mp = mp;
return memento;
}
}
public class Caretaker
{
public Memento memento { get; set; }
}
四 优缺点
4.1 优点
- 灵活, 客户端可自行管理需要备份的节点,甚至备份多个节点数据, 当有需求时,恢复到想要的节点状态。
4.2 缺点
- 当备份的需求发生变化时, 可能需要修改Memento和Originator类, 违背开开放封闭原则。
五 使用场景
- 需要保存与恢复数据的场景,如玩游戏时的中间结果的存档功能。
- 需要提供一个可回滚操作的场景,如 Word、记事本、Photoshop,Eclipse 等软件在编辑时按 Ctrl+Z 组合键,还有数据库中事务操作。