1. 基本概念

备忘录模式是一种行为设计模式,它允许在不暴露对象内部细节的情况下保存和恢复对象的内部状态。这种模式的核心思想是通过创建对象状态的快照(备忘录),并在需要时恢复到该快照状态,从而实现状态的管理。

2. 主要角色

备忘录模式包含以下三个主要角色:

  • 发起人(Originator):负责创建备忘录对象,并记录当前时刻的内部状态。它还定义了恢复内部状态的操作。在代码中,MobileOwner类就是发起人,它维护联系人列表的状态,并提供创建备忘录和恢复状态的方法。

  • 备忘录(Memento):用于存储发起人的内部状态,是一个快照。备忘录对象是一个不可变的(immutable)对象,外部对象只能读取备忘录中的状态,而不能修改它。在代码中,ContactMemento类就是备忘录,它保存了发起人(MobileOwner)的联系人列表状态。

  • 管理角色(Caretaker):负责保存备忘录对象,但不能访问备忘录对象中保存的状态信息。它只提供保存和获取备忘录的方法,用于限制对备忘录的访问权限。在代码中,Caretaker类就是管理角色,它保存备忘录对象,但不访问其中的状态信息。

代码实现了备忘录模式,用于保存和恢复手机联系人列表的状态。主要包括以下类:

  1. ContactPerson:表示联系人,包含姓名和手机号码。

  2. MobileOwner:发起人,维护联系人列表,可创建备忘录和恢复状态。

  3. ContactMemento:备忘录,保存发起人的内部状态(联系人列表的快照)。

  4. 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. 工作原理

备忘录模式的工作原理如下:

  1. 发起人创建一个备忘录对象,将当前内部状态保存到备忘录中。

  2. 管理角色保存这个备忘录对象。

  3. 当需要恢复状态时,发起人从管理角色获取备忘录对象,并使用备忘录中的状态恢复自己的内部状态。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐