zoukankan      html  css  js  c++  java
  • C#设计模式系列:备忘录模式(Memento)

    1、备忘录模式简介

    1.1>、定义

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

    1.2>、使用频率

       

    2、备忘录模式结构

    2.1>、结构图

    2.2>、参与者

      备忘录模式参与者:

      ◊ Memento

        ° 为创建对象的各个部件指定抽象接口

        ° 防止Originator意外的其他对象访问备忘录。备忘录实际上有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个Originator访问本备忘录的内部状态。

      ◊ Originator

        ° 创建一个备忘录,记录当前时刻的内部状态。

        ° 使用备忘录恢复内部状态。

      ◊ Caretaker

        ° 负责保存备忘录

        ° 不能对备忘录的内容进行操作或检查

      在备忘录模式中,Caretaker负责把Originator创建的Memento进行备份,当需要的时候,Originator可以再使用Caretaker中保存的Memento进行恢复,Originator中的所有状态被恢复到备份操作之前的状态。

    3、备忘录模式结构实现

      Memento.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DesignPatterns.MementoDesignPattern.Structural
    {
        public class Memento
        {
            private string _state;
    
            public Memento(string state)
            {
                this._state = state;
            }
    
            public string State
            {
                get { return _state; }
            }
        }
    }

      Originator.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DesignPatterns.MementoDesignPattern.Structural
    {
        public class Originator
        {
            private string _state;
    
            public string State
            {
                get
                {
                    return _state;
                }
                set
                {
                    _state = value;
                    Console.WriteLine("State = " + _state);
                }
            }
    
            public Memento CreateMemento()
            {
                return (new Memento(_state));
            }
    
            public void SetMemento(Memento memento)
            {
                Console.WriteLine("Restoring state...");
                State = memento.State;
            }
        }
    }

      Caretaker.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace DesignPatterns.MementoDesignPattern.Structural
    {
        public class Caretaker
        {
            private Memento _memento;
    
            public Memento Memento
            {
                get
                {
                    return _memento;
                }
                set
                {
                    _memento = value;
                }
            }
        }
    }

      Program.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using DesignPatterns.MementoDesignPattern.Structural;
    
    namespace DesignPatterns.MementoDesignPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                Originator o = new Originator();
                o.State = "On";
    
                Caretaker c = new Caretaker();
                c.Memento = o.CreateMemento();
    
                o.State = "Off";
                o.SetMemento(c.Memento);
            }
        }
    }

      运行输出:

    State = On
    State = Off
    Restoring state...
    State = On
    请按任意键继续. . .

    4、备忘录模式应用分析

      备忘录模式适用情形:

      1>、必须保存一个对象在某一个时刻的部分状态,这样以后需要时才能恢复到先前的状态。

      2>、如果用一个接口来让其他对象直接得到被保存对象的内部状态,将会暴露对象的实现细节并破坏对象的封装性。

      备忘录模式特点:

      1>、保持封装边界。使用备忘录可以避免暴露一些只应由Originator管理却又必须存储在Originator之外的信息。该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来,从而保持了封装边界。

      2>、简化Originator。在其他的保持封装性的设计中,Originator负责保持Client请求过的内部状态版本。把所存储管理的重任交给了Originator,让Client管理它们请求的状态将会简化Originator,并使得Client工作结束时无需通知Originator。

  • 相关阅读:
    【转】ERROR: Cannot uninstall 'llvmlite'. It is a distutils installed project. 此类报错的解决办法
    【转】python setup.py install 报错:error:[WinError 3]系统找不到指定的路径: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\PlatformSDK\\lib
    【转】距离相关系数以及python包的安装
    【转】算法总结这是一份全面并且详细的排序算法学习指南
    origin 一键导出文件夹中所有图形
    【转】距离相关系数的python实现
    [转]一文让你通俗理解奇异值分解
    origin 检查是否有重复图片
    【Vegas原创】centos网卡自启动
    【Vegas原创】使用dockercompose运行mysql8
  • 原文地址:https://www.cnblogs.com/libingql/p/3651033.html
Copyright © 2011-2022 走看看