已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。 如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。 Memento 备忘录模式提供解决途径,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在这个对象之外保存这个状态。这样就可以将对象恢复到原先保存的状态。设计模式 GOF Memento备忘录模式UML图如下:主要角色:1、原发器角色Originator:它是我们关注的对象,我们需要保存和回溯的状态就是它的状态。我们需要在它内部创建备忘录对象并利用备忘录对象保存我们需要保存的状态值,同时它还需要提供一种手段来恢复我们以前保存的状态值.2、备忘录对象Memento:它用于在不破坏封装性的前提下,捕获一个Originator的内部状态,并在备忘录对象Memento中保存这个状态。(Caretaker:用于防止原发器以外的对象访问备忘录对象,保证备忘录对象的安全性)。 下面我们用代码来示例,程序如下:一、备忘录模式思路示例 1、原发器角色OriginatorusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyMementoPattern/Memento模式适用于由原发器管理,却又必须存储在原发器之外的信息/定义原发器对象:Originator/有必要对自身内部状态进行保存,然后在某个点处又需要恢复内部状态的对象classOriginator#regionState属性privatestring_state;publicstringStategetreturn_state;set_state=value;Console.WriteLine(State=0,_state);#endregion/在实现Memento模式中,要防止原发器Originator以外的对象访问备忘录对象,备忘录对象有两个接口,一个为原发器使用的宽接口,一个为其他对象使用的窄接口#region创建Memento类的方法(Memento类将用于保存Originator对象的State状态值)publicMementoCreateMemento()Console.WriteLine(创建Memento对象并保存状态到此对象中.);return(newMemento(_state);/此处,在创建Memento对象时就保存了对象状态#endregion#region利用上面Memento对象保存的状态值进行状态恢复操作publicvoidSetMemento(Mementomemnto)Console.WriteLine(恢复对象状态.);State=memnto.State;#endregion 2、备忘录对象MementousingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyMementoPatternclassMemento/定义备忘录对象Memento类,它专门用于保存Originator类对象的状态信息/也即:在不破坏封装性的前提下,捕获一个Originator的内部状态,并在这个对象之外保存这个状态。/而这个状态值就保存在Memento类中privatestring_state;publicstringStategetreturn_state;#region构造函数publicMemento(stringstate)this._state=state;#endregion 3、CaretakerusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyMementoPattern/定义CareTaker类/此类的作用是保证Mmento类的安全性classCareTakerprivateMemento_memento;publicMementoMementogetreturn_memento;set_memento=value; 4、客户端应用#region基本思路示例Console.WriteLine(-备忘录模式基本思路示例-);Originatoro=newOriginator();o.State=On;/设置Originator类对象状态CareTakerc=newCareTaker();c.Memento=o.CreateMemento();Console.WriteLine(设置状态新值.);o.State=Off;o.SetMemento(c.Memento);Console.ReadKey();#endregion二、在客户对象上使用备忘录模式 1、原发器角色Originator:ClientsOriginatorusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyMementoPatternclassClientsOriginator#region姓名属性privatestring_name;publicstringNamegetreturn_name;set_name=value;Console.WriteLine(姓名:+_name);#endregion#region电话属性privatestring_phone;publicstringPhonegetreturn_phone;set_phone=value;Console.WriteLine(电话:+_phone);#endregion#region住址属性privatestring_address;publicstringAddressgetreturn_address;set_address=value;Console.WriteLine(住址:+_address);#endregionpublicClientMementoSaveMemento()Console.WriteLine(n保存客户状态n);return(newClientMemento(_name,_phone,_address);publicvoidRestoreMemento(ClientMementomemento)Console.WriteLine(n恢复客户状态值n);this.Name=memento.Name;this.Phone=memento.Phone;this.Address=memento.Address; 2、备忘录对象Memento:ClientsMementousingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyMementoPatternclassClientMemento#region姓名属性privatestring_name;publicstringNamegetreturn_name;set_name=value;#endregion#region电话属性privatestring_phone;publicstringPhonegetreturn_phone;set_phone=value;#endregion#region住址属性privatestring_address;publicstringAddressgetreturn_address;set_address=value;#endregionpublicClientMemento(stringname,stringphone,stringaddress)this._name=name;this._phone=phone;this._address=address; 3、Caretaker:ClientMemoryusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceMyMementoPatternclassClientMemoryprivateClientMementomemento;publicClientMementoMementogetreturnmemento;setmemento=value; 4、客户端应用#region客户状态示例Console.WriteLine(-在客户对象上使用备忘录模式-);ClientsOriginatorco=newClientsOriginator();co.Name=王军;co.Phone=86150338;co.Address=北京;ClientMemorycm=newClientMemory();cm.Memento=co.SaveMemento();Console.WriteLine(n修改客户状态n);co.Name=王小军;co.Phone=99999999;co.Address=深圳;co.RestoreMemento(cm.Memento);Console.ReadKey();#endregion运行效果如下:总结: 备忘录存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态。Memento模式适用于由原发器管理,却又必须存储在原发器之外的信息 在实现Memento模式中,要防
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国五矿招聘题库及答案
- 景观石购买合同协议
- 模板机上下位机协议书
- 临时采购员合同范本
- 数字化合同范本模板
- 锂电隔膜采购合同范本
- 新民居交房合同范本
- 校服服装订购合同范本
- 标识标牌保养合同范本
- 旅游区建设合同范本
- 2025年公安民警初级执法资格考试题库及答案
- 2025年重庆对外经贸学院辅导员考试试题及答案
- saas平台合同范本
- 拖拉管施工方案范本图片
- 2025年全国计算机技术与软件专业技术资格水平考试试题及答案
- 消防设施培训基本知识课件
- 北京市某中学2024-2025学年九年级上学期期中数学试卷(解析版)
- 供暖维修人员培训知识课件
- 排气净化与排放控制教学设计中职专业课-电控发动机维修-汽车运用与维修-交通运输大类
- 生活污水处理厂运营管理体系
- 2025年城市地下管线质量风险管理与应急处理可行性研究报告
评论
0/150
提交评论