联系人对象:
/// <summary>
/// 联系人对象
/// </summary>
public class Contact
{
public Contact(string name, string tel)
{
this.Name = name;
this.Telephone = tel;
}
public string Name { get; set; }
public string Telephone { get; set; }
}
备忘录对象:
/// <summary>
/// 备忘录对象
/// </summary>
public class ContactMemorandum
{
public ContactMemorandum(string name, List<Contact> contactList)
{
this.Name = name;
this.ContactList = contactList;
this.OperateTime = DateTime.Now;
}
public List<Contact> ContactList { get; set; }
public string Name { get; set; }
public DateTime OperateTime { get; set; }
}
手机用户:
/// <summary>
/// 手机用户
/// </summary>
public class Person
{
public Person(List<Contact> contactList)
{
this.ContactList = contactList;
}
/// <summary>
/// 联系人列表
/// </summary>
public List<Contact> ContactList { get; set; }
/// <summary>
/// 备份联系人
/// </summary>
public ContactMemorandum CreateMemorandum(string name)
{
//这里一定要使用深拷贝,否则会引用对象的传递,备份就无效
return new ContactMemorandum(name, CoreService.CloneData(this.ContactList));
}
/// <summary>
/// 恢复联系人
/// </summary>
public void RecoveryMemorandum(ContactMemorandum memorandum)
{
//这里一定要使用深拷贝,否则会引用对象的传递,备份就无效
this.ContactList = CoreService.CloneData(memorandum.ContactList);
}
/// <summary>
/// 展示联系人
/// </summary>
public void ShowContactList()
{
Console.WriteLine("\t当前我的联系人列表有{0}个联系人:", this.ContactList.Count);
int index = 0;
foreach (var contact in ContactList)
{
Console.WriteLine("\t{0}.姓名:{1},联系方式:{2}", ++index, contact.Name, contact.Telephone);
}
Console.WriteLine("----------------------------------------------------------");
}
}
备忘录管理器:
/// <summary>
/// 备忘录管理者:备份之后放在这里保管备忘录
/// </summary>
public class MemorandumManager
{
public MemorandumManager()
{
this.DictionaryMemorandum = new Dictionary<string, ContactMemorandum>();
}
public Dictionary<string, ContactMemorandum> DictionaryMemorandum { get; set; }
}
测试:
class Program
{
/// <summary>
/// 备忘录模式:
/// 虽然说是23中设计模式中的最后一个,但也是非常简单的一个设计模式
/// 顾名思义,就是将数据备份起来,万一我们误操作之后,以后可以恢复到指定的状态
///
/// 有一点需要注意:
/// 备忘录模式有两种恢复模式:1.单点恢复(恢复到上一次);2.多点恢复(有客户端指定,可以恢复到任意一次,只要之前备份过)
///
/// 此文中的例子:
/// 备份通讯录,恢复通讯录
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//初始化联系人集合
var contacts = "张三,李四,王五,赵柳,小李,小王,aaa,bbb,老板,同事"
.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(
(r, i) =>
{
string tel = string.Empty;
while (tel.Length < 11)
{
tel += (i + 1);
}
return new Contact(r, tel);
}).ToList();
//初始化手机用户
var person = new Person(contacts);
//展示当前联系人信息
Console.WriteLine("初始化手机联系人:");
person.ShowContactList();
//初始化备忘录对象
var manager = new MemorandumManager();
//备份
Console.WriteLine("第一次备份");
manager.DictionaryMemorandum.Add("第一次备份", person.CreateMemorandum("第一次备份"));
//删除几个联系人
foreach (var item in person.ContactList.FindAll(r => "张三,王五".Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Contains(r.Name)))
{
person.ContactList.Remove(item);
}
Console.WriteLine("删除两个人联系人:");
person.ShowContactList();
//修改几个联系人
person.ContactList.First(r => r.Name == "小王").Name = "大王";
person.ContactList.Add(new Contact("ccc", "123456789101"));
//展示当前联系人
Console.WriteLine("修改一个联系人,新增一个联系人:");
person.ShowContactList();
//第二次备份当前联系人
Console.WriteLine("第二次备份");
manager.DictionaryMemorandum.Add("第二次备份", person.CreateMemorandum("第二次备份"));
//删除几个联系人
foreach (var item in person.ContactList.FindAll(r => "aaa,bbb".Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Contains(r.Name)))
{
person.ContactList.Remove(item);
}
Console.WriteLine("删除两个人联系人:");
person.ShowContactList();
//修改几个联系人
person.ContactList.First(r => r.Name == "ccc").Name = "zzz";
Console.WriteLine("修改一个联系人:");
person.ShowContactList();
//恢复第一次的数据
person.RecoveryMemorandum(manager.DictionaryMemorandum["第一次备份"]);
//展示当前联系人
Console.WriteLine("恢复第一次备份的数据:");
person.ShowContactList();
//恢复第二次的数据
person.RecoveryMemorandum(manager.DictionaryMemorandum["第二次备份"]);
//展示当前联系人
Console.WriteLine("恢复第二次备份的数据:");
person.ShowContactList();
Console.ReadKey();
}
}