您的位置:首页 > 其它

《大话设计模式》学习笔记14:备忘录模式

2015-05-17 17:44 197 查看
  


  


游戏进度备忘示例:

  


1.Originator:

public class GameRole
{
public int Vitality { get; set; }
public int Attack { get; set; }
public int Defense { get; set; }
//状态显示
public void StateDisplay()
{
Console.WriteLine("角色当前状态:体力 {0},攻击力 {1},防御力 {2}", Vitality, Attack, Defense);
}
//获得初始状态
public void GetInitState()
{
Vitality = 100;
Attack = 100;
Defense = 100;
}
//战斗
public void Fight()
{
Vitality = 0;
Attack = 0;
Defense = 0;
}

public RoleStateMemento SaveState()
{
return new RoleStateMemento(Vitality, Attack, Defense);
}
public void RecoveryState(RoleStateMemento roleStateMemento)
{
Vitality = roleStateMemento.Vitality;
Attack = roleStateMemento.Attack;
Defense = roleStateMemento.Defense;
}
}


2.Memento:

public class RoleStateMemento
{
public int Vitality { get; set; }
public int Attack { get; set; }
public int Defense { get; set; }

public RoleStateMemento(int vitality,int attack,int defense)
{
Vitality = vitality;
Attack = attack;
Defense = defense;
}
}


3.Caretaker:

public class RoleStateCaretaker
{
public RoleStateMemento RoleStateMemento { get; set; }

}


4.客户端代码:

class Program
{
static void Main(string[] args)
{
GameRole gameRole = new GameRole();
gameRole.GetInitState();
gameRole.StateDisplay();

RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
roleStateCaretaker.RoleStateMemento = gameRole.SaveState();

gameRole.Fight();
gameRole.StateDisplay();

gameRole.RecoveryState(roleStateCaretaker.RoleStateMemento);
gameRole.StateDisplay();
}
}


  备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

  如果某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: