|
定义:备忘录模式(MementoPattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
类型:对象行为型模式。 概述: 备忘录模式使用的范围比较窄,即比较复杂的状态需要恢复到之前的状态。现实更多的情况只有很简单的状态需要恢复,如果用备忘录模式有点大材小用的感觉。就像用大炮打蚊子,起不到什么作用。在《Head First Design Patterns》,备忘录模式也被列为不常用的模式之一。 备忘录模式相对比较简单,即把一个有着复杂状态且需要恢复Originator的对象中的一些需要被保存的状态再次抽象出来,并提供一些操作接口封装成一个Memento类。这样将极大简化Originator类的复杂性。Memento的接口因为是操作状态的,所以不应该开放给更多的人知道,所以这里又继续封装了一个管理Memento类的Caretaker类,并提供一些简单对外的接口。 恢复状态,其实玩过单机剧情类游戏的人都会马上想到“存档”这个功能。“存档”功能在某种意义上就是备忘录的一种应用。这里即以我最喜欢的游戏Warcraft III为示例。 类图:
参与者:
示例代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern19
{
class Warcrift
{
private string role;
public string Role
{
get { return role; }
set { role = value; }
}
public Memento CreateMemento()
{
return (new Memento(role));
}
public void SetMemento(Memento memento)
{
role = memento.Role;
}
public void Start()
{
Console.WriteLine("There is a " + role);
}
}
class Memento
{
private string role;
public Memento(string _role)
{
this.role = _role;
}
public string Role
{
get { return role; }
}
}
class Caretaker
{
private Memento memento;
public Memento Memento
{
get { return memento; }
set { memento = value; }
}
}
class Program
{
static void Main(string[] args)
{
// 初始角色是英雄
Warcrift war3 = new Warcrift();
war3.Role = "Hero";
war3.Start();
Caretaker caretaker = new Caretaker();
caretaker.Memento = war3.CreateMemento();
// 更换角色为小兵
war3.Role = "Soldier";
war3.Start();
// 退回到初始状态
war3.SetMemento(caretaker.Memento);
war3.Start();
}
}
}
适用性:
优缺点:
参考资料:
|
设计模式19——行为型模式之备忘录模式,布布扣,bubuko.com
原文:http://blog.csdn.net/feihe0755/article/details/20795727