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();

    结果:

    三、总结

    优:

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

    缺:

    • 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。
  • 相关阅读:
    剑指offer03-04
    五大算法-1.回溯法
    linux与操作系统(1)- 用户接口
    python中的装饰器
    mysql 创建数据库,用户并给用户设置权限
    centOS6.5 桌面状态栏消失 解决
    centOS linux 远程Mysql 记录之root用户密码丢失
    XStream.toXML() 简单两种使用实例
    FileInputStream和FileOutStream 简单的使用实例;
    orale 行转列或者 字符拼接函数 wmsys.wm_concat()函数 /instr(listagg(name,';') within group (order by o.srclinkedid)
  • 原文地址:https://www.cnblogs.com/sunchong/p/5154233.html
Copyright © 2011-2022 走看看