zoukankan      html  css  js  c++  java
  • 设计模式(十九):备忘录模式

    一、定义

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态

    二、实例

    2.1 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。

     public class Originator
        {
            private string state = string.Empty;
            public string GetState()
            {
                return state;
            }
            public void SetState(string _state)
            {
                state = _state;
            }
            public Memento CreatMemento()
            {
                return new Memento(state);
            }
            public void RestoreMemento(Memento _memento)
            {
                SetState(_memento.GetState());
            }
        }

    2.2 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。

    public class Memento
        {
            private string state = string.Empty;
            public Memento(string _state)
            {
                state = _state;
            }
            public string GetState()
            {
                return state;
            }
            public void SetState(string _state)
            {
                state = _state;
            }
        }

    2.3 管理角色:对备忘录进行管理,保存和提供备忘录。

    public class Caretaker
        {
            private Memento memento;
            public void SetMemento(Memento _memento)
            {
                memento = _memento;
            }
            public Memento GetMemento()
            {
                return memento;
            }
        }

    2.4 客户端:

    //-------------------------备忘录模式---------------------
                Memento.Originator originator = new Memento.Originator();
                originator.SetState("初始状态—1");
                Console.WriteLine("初始状态:{0}", originator.GetState());
                //备忘状态
                Memento.Caretaker caretaker = new Memento.Caretaker();
                caretaker.SetMemento(originator.CreatMemento());
                //修改状态
                originator.SetState("状态—2");
                Console.WriteLine("修改状态:{0}", originator.GetState());
                //恢复状态
                originator.RestoreMemento(caretaker.GetMemento());
                Console.WriteLine("恢复后状态:{0}", originator.GetState());
                Console.ReadKey();

    结果:

    三、总结

    优:

    • 当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。
    • 备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。

    缺:

    • 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。
  • 相关阅读:
    LeetCode Binary Tree Inorder Traversal
    LeetCode Populating Next Right Pointers in Each Node
    LeetCode Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode Reverse Linked List II
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Pascal's Triangle
    Palindrome Construct Binary Tree from Preorder and Inorder Traversal
    Pascal's Triangle II
    LeetCode Word Ladder
    LeetCode Binary Tree Zigzag Level Order Traversal
  • 原文地址:https://www.cnblogs.com/sunchong/p/5154233.html
Copyright © 2011-2022 走看看