备忘录模式(Memento Pattern)

    • 储存系统关键对象的重要状态;
    • 维护关键对象的封装。

    单一职责原则告诉我们,设计时不要把保持状态的工作和关键对象混在一起。这个专门掌握状态的对象,就称为备忘录。

    备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用存储起来的备忘录将状态复原,当前很多软件都提供了Undo(撤销)操作功能,就使用了备忘录模式。

    Originator(发起人):负责创建一个备忘录Memeto,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可根据需要决定Memento储存Originator的哪些状态。

    Memeto(备忘录):负责存储Originator对象的内部状态,并可防止Originator意外的其它对象访问备忘录Memeto。备忘录有两个接口,Creataker只能看到备忘录的窄接口,它只能将备忘录传递给其它对象。Originator只能看到一个窄接口,允许它访问返回到先前状态所需的所有数据。

    发起人(Originator)类

    备忘录(Memento)类

    1. {
    2. private string state;
    3. public Memento(string state)
    4. {
    5. this.state = state;
    6. }
    7. public string State
    8. {
    9. get {return state;}
    10. }
    11. }

    管理者(Caretaker)类

    客户端程序

    1. static void Main(string[] args)
    2. {
    3. Originator o = new Originator();
    4. o.State = "On";
    5. o.show();
    6. Caretaker c = new Caretaker();
    7. c.Memento = o.CreateMemento();
    8. o.State = "Off";
    9. o.Show();
    10. o.Show();
    11. }

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

    当角色状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

    游戏角色类

    角色状态储存箱类

    1. class RoleStateMemento
    2. {
    3. private int vit;
    4. private int atk;
    5. private int def;
    6. public RoleStateMemento(int vit, int atk, int def)
    7. {
    8. this.vit = vit;
    9. this.atk = atk;
    10. this.def = def;
    11. }
    12. //生命力
    13. public int Vtality
    14. {
    15. get {return vit;}
    16. set {vit = value;}
    17. }
    18. //攻击力
    19. public int Attack
    20. {
    21. get {return atk;}
    22. set {vit = value;}
    23. //防御力
    24. {
    25. get {return def;}
    26. set {def = value;}
    27. }
    28. }

    角色状态管理者

    客户端代码

    1. static void Main(string[] args)
    2. {
    3. //大战Boss前
    4. GameRole lixiaoyao = new GameRole();
    5. lixiaoyao.GetInitState();
    6. lixiaoyao.StateDisplay();
    7. //保存进度
    8. RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
    9. stateAdmin.memento = lixiaoyao.SaveState();
    10. //大战Boss时,损耗严重
    11. lixiaoyao.Fight();
    12. lixiaoyao.StateDisplay();
    13. //恢复之前状态
    14. lixiaoyao.RecoveryState(stateAdmin.Memento);
    15. lixiaoyao.StateDisplay();
    16. Console.Read();