C#23种设计模式(二)备忘录模式
1. 基本概念
备忘录模式是一种行为设计模式,它允许在不暴露对象内部细节的情况下保存和恢复对象的内部状态。这种模式的核心思想是通过创建对象状态的快照(备忘录),并在需要时恢复到该快照状态,从而实现状态的管理。
2. 主要角色
备忘录模式包含以下三个主要角色:
-
发起人(Originator):负责创建备忘录对象,并记录当前时刻的内部状态。它还定义了恢复内部状态的操作。在代码中,MobileOwner类就是发起人,它维护联系人列表的状态,并提供创建备忘录和恢复状态的方法。
-
备忘录(Memento):用于存储发起人的内部状态,是一个快照。备忘录对象是一个不可变的(immutable)对象,外部对象只能读取备忘录中的状态,而不能修改它。在代码中,ContactMemento类就是备忘录,它保存了发起人(MobileOwner)的联系人列表状态。
-
管理角色(Caretaker):负责保存备忘录对象,但不能访问备忘录对象中保存的状态信息。它只提供保存和获取备忘录的方法,用于限制对备忘录的访问权限。在代码中,Caretaker类就是管理角色,它保存备忘录对象,但不访问其中的状态信息。
代码实现了备忘录模式,用于保存和恢复手机联系人列表的状态。主要包括以下类:
-
ContactPerson:表示联系人,包含姓名和手机号码。
-
MobileOwner:发起人,维护联系人列表,可创建备忘录和恢复状态。
-
ContactMemento:备忘录,保存发起人的内部状态(联系人列表的快照)。
-
Caretaker:管理角色,负责保存备忘录对象。
1. ContactPerson类
public class ContactPerson
{
public string MobileNum { get; set; }
public string Name { get; set; }
}
-
作用:表示一个联系人,包含两个属性:手机号码(MobileNum)和姓名(Name)。
-
解释:这是数据载体类,用于存储联系人的基本信息,在备忘录模式中作为发起人状态的一部分被保存和恢复。
2. ContactMemento类(备忘录)
public class ContactMemento
{
//保存发起人的状态
public List<ContactPerson> contactPersonBack;
public ContactMemento(List<ContactPerson> persons)
{
contactPersonBack = persons;
}
}
-
作用:备忘录角色,用于保存发起人(MobileOwner)的内部状态,即联系人列表的快照。
-
解释:
-
contactPersonBack:存储发起人状态的变量,是一个联系人列表的副本。 -
构造函数接收一个联系人列表,并将其赋值给
contactPersonBack,从而保存发起人的当前状态。这体现了备忘录模式中备忘录保存发起人状态的特点。
-
3. MobileOwner类(发起人)
public class MobileOwner
{
public MobileOwner(List<ContactPerson> persons)
{
ContactPersons = persons;
}
//发起人需要保存内部状态
public List<ContactPerson> ContactPersons { get; set; }
//创建备忘录
public ContactMemento CreateMemento()
{
return new ContactMemento(new List<ContactPerson>(this.ContactPersons));
}
//将备忘录中的数据备份导入联系人中
public void RestoreMemento(ContactMemento memento)
{
this.ContactPersons = memento.contactPersonBack;
}
public void Show()
{
Console.WriteLine("联系人列表中有{0}个人", ContactPersons.Count);
foreach (ContactPerson per in ContactPersons)
{
Console.WriteLine("姓名:{0} 号码{1}", per.Name, per.MobileNum);
}
}
}
-
作用:发起人角色,维护联系人列表,并提供创建备忘录和恢复状态的方法。
-
解释:
-
构造函数:初始化联系人列表。
-
ContactPersons:发起人的内部状态,即联系人列表。 -
CreateMemento方法:创建备忘录对象,将当前联系人列表的状态保存到备忘录中。这体现了发起人创建备忘录以保存状态的功能。 -
RestoreMemento方法:从备忘录中恢复联系人列表的状态。这体现了发起人从备忘录恢复状态的功能。 -
Show方法:显示联系人列表的信息,用于演示状态的变化。
-
4. Caretaker类(管理角色)
public class Caretaker
{
public ContactMemento ContactM { get; set; }
}
-
作用:管理角色,负责保存备忘录对象。
-
解释:
-
ContactM:保存备忘录对象的变量。 -
管理角色不访问备忘录中的状态信息,只是负责保存和提供备忘录,这符合备忘录模式中管理角色的职责。
-
5. Program类(主程序)
public class Program : OpenDesign
{
public override void Open()
{
List<ContactPerson> persons = new List<ContactPerson>()
{
new ContactPerson(){ Name="Learning Hard",MobileNum="123456" },
new ContactPerson(){ Name="Tony",MobileNum="234567" },
new ContactPerson(){ Name="Jock",MobileNum="345678" }
};
MobileOwner mobileOwner = new MobileOwner(persons);
mobileOwner.Show();
//创建备忘录并保存对象
Caretaker caretaker = new Caretaker();
caretaker.ContactM = mobileOwner.CreateMemento();
//更改发起联系人列表
Console.WriteLine("----移除最后一个联系人----");
mobileOwner.ContactPersons.RemoveAt(2);
mobileOwner.Show();
//恢复到原始状态
Console.WriteLine("----恢复联系人列表----");
mobileOwner.RestoreMemento(caretaker.ContactM);
mobileOwner.Show();
Console.Read();
}
}
-
作用:主程序,演示备忘录模式的使用。
-
解释:
-
创建初始联系人列表和MobileOwner对象,并显示初始状态。
-
创建备忘录并保存到Caretaker中。
-
修改联系人列表(移除最后一个联系人),并显示修改后的状态。
-
使用备忘录恢复联系人列表到初始状态,并显示恢复后的状态。
-
这段代码完整地演示了备忘录模式的典型应用场景:保存状态、修改状态、恢复状态。
-
1.备忘录模式适用于以下场景:
-
需要保存和恢复对象状态的场景,如游戏的存档与读档功能、文档编辑器的撤销操作等。
-
当直接访问对象内部状态不恰当或需要限制访问时,通过备忘录模式可以在不暴露内部细节的情况下保存和恢复状态。
2.优点
-
封装性:发起人的内部状态被封装在备忘录中,外部对象无法直接访问或修改这些状态,从而保护了对象的内部表示。
-
简单性:管理角色只负责保存和获取备忘录,不涉及状态的处理逻辑,使得代码结构清晰。
-
灵活性:可以方便地保存多个状态,并在需要时恢复到任意一个之前的状态,适用于需要频繁保存和恢复状态的场景。
3. 工作原理
备忘录模式的工作原理如下:
-
发起人创建一个备忘录对象,将当前内部状态保存到备忘录中。
-
管理角色保存这个备忘录对象。
-
当需要恢复状态时,发起人从管理角色获取备忘录对象,并使用备忘录中的状态恢复自己的内部状态。
更多推荐
所有评论(0)