zoukankan      html  css  js  c++  java
  • 设计模式(22)---备忘录模式

    基本定义

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

    解释:简单来说,就是保存一个对象在某一时刻的特定状态,在以后需要的时候可以将对象恢复到保存时的状态。

    基本代码:

    class Originator
        {
            private string state;
            public string State
            {
                get { return state; }
                set { state = value; }
            }
    
            public Memento CreateMemento()
            {
                return new Memento(state);
            }
    
            public void SetMemento(Memento memento)
            {
                state = memento.State;
            }
    
            public void Display()
            {
                Console.WriteLine("State=" + state);
            }
        }
    
        class Memento
        {
            private string state;
            public string State
            {
                get { return state; }
            }
    
            public Memento(string state)
            {
                this.state = state;
            }
        }
    
        class Caretaker
        {
            private Memento memento1;
            public Memento Memento1
            {
                get { return memento1; }
                set { memento1 = value; }
            }
        }

    客户端调用:

    Originator originator = new Originator();
                originator.State = "on";
                originator.Display();
    
                Caretaker caretaker = new Caretaker();
                caretaker.Memento1 = originator.CreateMemento();
    
                originator.State = "off";
                originator.Display();
    
                originator.SetMemento(caretaker.Memento1);
                originator.Display();
    View Code

    列举具体实例:

    打游戏,保存一角色在打boss前的状态,待打boss结束后再恢复到它之前的状态。

    class Program
        {
            static void Main(string[] args)
            {
                Role role = new Role(100, 100);
                Console.WriteLine("大战前:");
                role.Display();
    
                Caretaker caretaker = new Caretaker();
                caretaker.memento = role.SaveMemento();
    
                role.SetBloodFlow(20);
                role.SetMagicPoint(20);
                Console.WriteLine("大战");
                role.Display();
    
                role.RestoreMemento(caretaker.GetMemento());
                Console.WriteLine("恢复");
                role.Display();
    
                Console.Read();
            }
        }
    
        class Role
        {
            private int bloodFlow;
            private int magicPoint;
    
            public Role(int bloodFlow, int magicPoint)
            {
                this.bloodFlow = bloodFlow;
                this.magicPoint = magicPoint;
            }
    
            public int GetBloodFlow()
            {
                return bloodFlow;
            }
    
            public void SetBloodFlow(int bloodFlow)
            {
                this.bloodFlow = bloodFlow;
            }
    
            public int GetMagicPoint()
            {
                return magicPoint;
            }
    
            public void SetMagicPoint(int magicPoint)
            {
                this.magicPoint = magicPoint;
            }
    
            public void Display()
            {
                Console.WriteLine("用户当前的状态:");
                Console.WriteLine("血量:" + GetBloodFlow() + ";蓝量:" + GetMagicPoint());
            }
    
            public Memento SaveMemento()
            {
                return new Memento(GetBloodFlow (),GetMagicPoint ());
            }
    
            public void RestoreMemento(Memento memento)
            {
                this.bloodFlow = memento.GetBloodFlow();
                this.magicPoint = memento.GetMagicPoint();
            }
        }
    
        class Memento
        {
            private int bloodFlow;
            private int magicPoint;
    
            public Memento(int bloodFlow, int magicPoint)
            {
                this.bloodFlow = bloodFlow;
                this.magicPoint = magicPoint;
            }
    
            public int GetBloodFlow()
            {
                return bloodFlow;
            }
    
            public void SetBloodFlow(int bloodFlow)
            {
                this.bloodFlow = bloodFlow;
            }
    
            public int GetMagicPoint()
            {
                return magicPoint;
            }
    
            public void SetMagicPoint(int magicPoint)
            {
                this.magicPoint = magicPoint;
            }
        }
    
        class Caretaker
        {
            public Memento memento;
    
            public Memento GetMemento()
            {
                return memento;
            }
    
            public void SetMemento(Memento memento)
            {
                this.memento = memento;
            }
        }
    View Code

    备忘录模式的优缺点及适用场景:

    优点:

    为用户提供一种可以恢复状态的机制,用户比较方便的恢复到某个历史状态。

    隐藏恢复细节,用户不需要关心状态的保存细节。

    缺点:

    对象状态需要完整存储到备忘录对象中,如果状态数据很大,那么在资源消耗上,备忘录对象会非常耗内存。

    适用场景:

    简单来说,显现其优点回避其缺点的地方都可以使用备忘录模式。

  • 相关阅读:
    SpringBoot整合flyway
    JavaFTP递归查询指定目录下的所有目录和文件
    初识网络设备
    Session
    Cookie
    文件下载
    PHP文件上传
    数据库操作函数笔记
    Apache #Tomcat CVE-2020-9484
    红方人员实战手册
  • 原文地址:https://www.cnblogs.com/ysyn/p/4213752.html
Copyright © 2011-2022 走看看