首页 > 学院 > 开发设计 > 正文

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

2019-11-14 16:14:52
字体:
来源:转载
供稿:网友

基本定义

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

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

 

基本代码:

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

 

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

优点:

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

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

缺点:

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

适用场景:

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

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表