本文向您展示了如何深入理解Java设计模式的memory模式。内容简洁易懂,一定会让你大放异彩。希望通过这篇文章的详细介绍,你能有所收获。
00-1010定义:在不破坏闭包的情况下捕获对象的内部状态,并将该状态保存在对象外部。这样,对象可以在以后恢复到其原始保存状态。
该模式用于保存对象的当前状态,以后可以再次恢复到该状态。实现纪念品模式的方式需要保证保存的对象状态不会被外部的对象访问,
目的是保护这些对象的保存状态的完整性,并防止内部实现被暴露。
一、什么是备忘录模式
涉及角色:
1.发起方:负责创建备忘录备忘录,记录其当前时刻的内部状态,并使用备忘录恢复内部状态。发起者可以根据需要决定Memento存储的内部状态。
2.纪念品:负责存储发起方对象的内部状态,可以防止发起方以外的其他对象访问备忘录。备忘录有两个界面:看管人只能看到备忘录的狭窄界面,他只能将备忘录传递给其他对象。发起人可以看到备忘录的宽界面,允许它访问所有需要的数据,以返回到以前的状态。
3.管理员(经理):负责备忘录备忘录,不能访问或操作备忘录的内容。
00-1010 1.需要保存和恢复数据的相关状态场景。
2.提供一个可以回滚的操作。
3.memento模式用于数据库连接的事务管理。
二、备忘录模式的结构
优点:
1.有时,某些发起人对象的内部信息必须存储在发起人对象之外,但必须由发起人对象本身读取。此时,使用纪念品图案可以将赞助商复杂的内部信息与其他物体屏蔽开来,从而妥善维护包装边界。
2.这个模型简化了发起的人类。发起人不再需要管理和保存其内部状态的版本,客户可以自行管理这些状态的版本。
3.当发起人角色的状态改变时,该状态可能无效。此时,临时存储的备忘录可用于恢复状态。
缺点:
1.如果发起者角色的状态需要完全存储在memo对象中,那么memo对象在资源消耗方面将是昂贵的。
2.当负责人的角色存储备忘录时,负责人可能不知道这种状态会占用多少存储空间,因此不可能提醒用户某项操作是否昂贵。
3.当发起人角色的状态发生变化时,本协议可能无效。如果状态改变成功率不高,最好采用“If”协议模式。
三、备忘录模式的使用场景
实例:备份电话簿
联系人-需要备份的数据是状态数据,没有操作。
publicsealedclassContactPerson
{
//名称
publicstringName { get设置;}
//电话号码
publicstringMobileNumber { get设置;}
}发起者-相当于[发起者角色]发起者。
public sealed class mobilebacokoriginator
{
//发起方需要保存的内部状态
privatestcontactperson _ person list;
公共列表联系人联系人列表
{
得到
{
n
bsp; return this._personList;
}
set
{
this._personList = value;
}
}
//初始化需要备份的电话名单
public MobileBackOriginator(List<ContactPerson> personList)
{
if (personList != null)
{
this._personList = personList;
}
else
{
throw new ArgumentNullException("参数不能为空!");
}
}
// 创建备忘录对象实例,将当期要保存的联系人列表保存到备忘录对象中
public ContactPersonMemento CreateMemento()
{
return new ContactPersonMemento(new List<ContactPerson>(this._personList));
}
// 将备忘录中的数据备份还原到联系人列表中
public void RestoreMemento(ContactPersonMemento memento)
{
this.ContactPersonList = memento.ContactPersonListBack;
}
public void Show()
{
Console.WriteLine("联系人列表中共有{0}个人,他们是:", ContactPersonList.Count);
foreach (ContactPerson p in ContactPersonList)
{
Console.WriteLine("姓名: {0} 号码: {1}", p.Name, p.MobileNumber);
}
}
}
备忘录对象,用于保存状态数据,保存的是当时对象具体状态数据--相当于【备忘录角色】Memeto
public sealed class ContactPersonMemento { // 保存发起人创建的电话名单数据,就是所谓的状态 public List<ContactPerson> ContactPersonListBack { get; private set; } public ContactPersonMemento(List<ContactPerson> personList) { ContactPersonListBack = personList; } }
管理角色,它可以管理【备忘录】对象,如果是保存多个【备忘录】对象,当然可以对保存的对象进行增、删等管理处理---相当于【管理者角色】Caretaker
public sealed class MementoManager { //如果想保存多个【备忘录】对象,可以通过字典或者堆栈来保存,堆栈对象可以反映保存对象的先后顺序 //比如:public Dictionary<string, ContactPersonMemento> ContactPersonMementoDictionary { get; set; } public ContactPersonMemento ContactPersonMemento { get; set; } }
客户端代码
class Program { static void Main(string[] args) { List<ContactPerson> persons = new List<ContactPerson>() { new ContactPerson() { Name="黄飞鸿", MobileNumber = "13533332222"}, new ContactPerson() { Name="方世玉", MobileNumber = "13966554433"}, new ContactPerson() { Name="洪熙官", MobileNumber = "13198765544"} }; //手机名单发起人 MobileBackOriginator mobileOriginator = new MobileBackOriginator(persons); mobileOriginator.Show(); // 创建备忘录并保存备忘录对象 MementoManager manager = new MementoManager(); manager.ContactPersonMemento = mobileOriginator.CreateMemento(); // 更改发起人联系人列表 Console.WriteLine("----移除最后一个联系人--------"); mobileOriginator.ContactPersonList.RemoveAt(2); mobileOriginator.Show(); // 恢复到原始状态 Console.WriteLine("-------恢复联系人列表------"); mobileOriginator.RestoreMemento(manager.ContactPersonMemento); mobileOriginator.Show(); Console.Read(); } }
上述内容就是怎样深入理解Java设计模式的备忘录模式,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/71910.html