【地铁上的设计模式】--行为型模式:备忘录模式

2023-05-11 17:57:12 浏览数 (2)

什么是备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,其目的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存该状态,以便之后恢复对象到该状态。该模式可以使得对象的状态历史可以被保存和管理。 在备忘录模式中,有三个主要角色:

  1. Originator:原发器,负责创建一个备忘录,用于记录当前状态,并可以根据备忘录恢复其状态。
  2. Memento:备忘录,用于存储 Originator 的状态。
  3. Caretaker:负责保存备忘录。

备忘录模式的优点是可以实现对象状态的保存和恢复,而且可以保证数据的安全性和封装性。同时,备忘录模式可以减少系统中类的数量,使得类的职责更加清晰,更容易维护和扩展。然而,备忘录模式也存在一些缺点,例如在某些情况下,备忘录的创建和恢复操作可能会耗费大量的系统资源。此外,备忘录模式会增加程序的复杂度和理解难度。

如何实现备忘录模式

实现备忘录模式的步骤如下:

  1. 创建Originator类,其中包含需要保存的状态。
  2. 创建Memento类,用于保存Originator对象的状态。
  3. 创建Caretaker类,用于保存Memento对象并对其进行管理。
  4. 在Originator类中添加创建Memento对象和从Memento对象中恢复状态的方法。
  5. 在Caretaker类中添加保存Memento对象和获取Memento对象的方法。
  6. 在客户端代码中使用Originator对象创建Memento对象并将其保存到Caretaker对象中。当需要恢复状态时,从Caretaker对象中获取Memento对象并使用它来恢复Originator对象的状态。

其中,Originator类为备忘录模式的核心类,用于保存和恢复需要备份的对象状态。Memento类用于保存Originator对象的状态,并提供了一个接口,使得只有Originator对象可以访问Memento对象中的状态。Caretaker类则用于保存和管理Memento对象,但它不能直接访问Memento对象中的状态。在实际应用中,可以通过使用备忘录模式来实现撤销、重做等功能。 Java实现 以下是Java实现备忘录模式的示例代码:

代码语言:javascript复制
// 备忘录类,用于保存状态
public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

// 发起人类,维护状态
public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 管理者类,用于管理备忘录
public class CareTaker {
    private List<Memento> mementoList = new ArrayList<Memento>();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }
}

在该示例代码中,Memento类用于保存状态,Originator类用于维护状态,并提供了保存状态和恢复状态的方法,CareTaker类用于管理备忘录,提供了添加备忘录和获取备忘录的方法。这些类共同实现了备忘录模式。 C#实现 以下是在 C# 中实现备忘录模式的示例代码:

代码语言:javascript复制
// 备忘录类
class Memento
{
    public string State { get; }

    public Memento(string state)
    {
        State = state;
    }
}

// 发起人类
class Originator
{
    private string _state;

    public string State
    {
        get => _state;
        set
        {
            _state = value;
            Console.WriteLine($"Current state: {_state}");
        }
    }

    public Memento CreateMemento()
    {
        return new Memento(_state);
    }

    public void RestoreMemento(Memento memento)
    {
        State = memento.State;
    }
}

// 管理者类
class Caretaker
{
    private Memento _memento;

    public Memento Memento
    {
        get => _memento;
        set => _memento = value;
    }
}

以上代码中,Memento 类表示备忘录,Originator 类是发起人,它维护了一个状态(_state),并可以创建备忘录和恢复状态。Caretaker 类是管理者,它维护了一个备忘录(_memento)。在实际使用时,我们可以通过 Originator 类来创建备忘录,然后将备忘录交给 Caretaker 类来管理,当需要恢复状态时,再将备忘录交还给 Originator 类进行恢复。

总结

备忘录模式是一种行为型设计模式,用于捕捉和存储对象的内部状态,以便在将来的时间点恢复对象到这个状态。备忘录模式的核心思想是将对象状态封装到备忘录对象中,从而使得对象能够在不破坏封装的前提下恢复到先前的状态。 优点: 1.备忘录模式实现了信息的封装,使得客户端无法直接访问对象的状态,提高了对象的安全性。 2.备忘录模式对于实现撤销和恢复功能非常有用,可以对对象状态进行恢复和历史记录的保存。 3.备忘录模式可以有效地减少对象状态的复制,从而提高程序的性能。

缺点: 1.备忘录模式需要保存对象的历史状态,因此在内存使用方面需要注意。 2.备忘录模式会增加程序的复杂性和代码量,因为需要维护备忘录的创建、保存、撤销和恢复等功能。

0 人点赞