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

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

    优点:

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

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

    缺点:

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

    适用场景:

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

  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/ysyn/p/4213752.html
Copyright © 2011-2022 走看看