备忘录模式---设计模式(22)
2018-06-18 02:59:00来源:未知 阅读 ()
基本定义
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
解释:简单来说,就是保存一个对象在某一时刻的特定状态,在以后需要的时候可以将对象恢复到保存时的状态。
基本代码:
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();
列举具体实例:
打游戏,保存一角色在打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; } }
备忘录模式的优缺点及适用场景:
优点:
为用户提供一种可以恢复状态的机制,用户比较方便的恢复到某个历史状态。
隐藏恢复细节,用户不需要关心状态的保存细节。
缺点:
对象状态需要完整存储到备忘录对象中,如果状态数据很大,那么在资源消耗上,备忘录对象会非常耗内存。
适用场景:
简单来说,显现其优点回避其缺点的地方都可以使用备忘录模式。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 小游戏二之---------------五子棋 2020-03-23
- C++ 静态成员----细谈static修饰的成员 2020-03-19
- C++之观察者模式 2020-03-19
- c++之模板模式 2020-03-12
- C++之策略模式 2020-03-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash