码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(22)---备忘录模式

时间:2015-01-09 18:42:50      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

基本定义

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

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

 

基本代码:

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; }
        }
    }
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

 

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

优点:

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

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

缺点:

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

适用场景:

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

 

设计模式(22)---备忘录模式

标签:

原文地址:http://www.cnblogs.com/ysyn/p/4213752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!