备忘录模式 -- 大话设计模式
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态
1.游戏打Boss前,习惯性存档
游戏角色站在副本外,思考中……,思考结束,开启外挂模式(存档,打不过重新再来……(*^__^*) 嘻嘻……),再次检查人物状态,是否满血满蓝~。进副本,遇见Boss就跪了~,赶紧出来,一阵后怕,还好哥有存档,要不白瞎了3个月的泡面钱~
首先定义一个游戏角色类,内置创建备忘录和恢复备忘录功能
/// <summary> /// 游戏角色(发起人对象:负责创建备忘录,用以记录当前时刻它的内部状态) /// </summary> public class GameCharacter { /// <summary> /// 需要保持的属性,可能有多个 /// </summary> public string State { get; set; } /// <summary> /// 创建备忘录 /// </summary> public Memento CreateMemento() { return new Memento(this.State); } /// <summary> /// 恢复备忘录 /// </summary> public void SetMemento(Memento memento) { State = memento.State; } /// <summary> /// 显示角色状态 /// </summary> public void Show() { Console.WriteLine("游戏角色当前状态:{0}", this.State); } }
定义备忘录类,来存储游戏角色的当前各种状态
/// <summary> /// 备忘录(负责存储发起人对象的内部状态,并可防止发起人以外的其他对象范文备忘录) /// </summary> public class Memento { public Memento(string state) { this.State = state; } public string State { get; set; } }
定义备忘录管理类,仅仅负责存储备忘录
/// <summary> /// 管理者(负责保持备忘录对象,不能对备忘录的内容进行操作活检查) /// </summary> public class Caretaker { public Memento Memento { get; set; } }
开启场景模拟
static void Main(string[] args) { //游戏角色站在副本外,思考中…… GameCharacter ter = new GameCharacter(); ter.State = "马上进副本了,赶紧保存一下,当前状态:满血、满蓝!"; //思考结束,开启外挂模式(存档,打不过重新再来……(*^__^*) 嘻嘻……) Caretaker caretaker = new Caretaker(); caretaker.Memento = ter.CreateMemento(); //再次检查人物状态,是否满血满蓝~ ter.Show(); //进副本,遇见Boss就跪了~ ter.State = "我靠,BOSS太BT,直接跪了/(ㄒoㄒ)/~~"; ter.Show(); //赶紧出来,一阵后怕,还好哥有存档,要不白瞎了3个月的泡面钱~ ter.SetMemento(caretaker.Memento); ter.Show(); }