重温设计模式 --- 备忘录模式

2023-10-22 16:44:58 浏览数 (2)

引言

备忘录模式是一种行为型设计模式,它允许你捕获对象的内部状态,并在不暴露其实现细节的情况下将其保存在外部对象中,从而可以在以后的某个时间点将该对象恢复到先前的状态。

备忘录模式有以下几个主要角色:

  • Originator(原发器):是需要被保存状态的对象。它可以创建一个Memento对象来存储它的当前状态,并从Memento对象中恢复它之前的状态。
  • Memento(备忘录):存储Originator的内部状态。只有Originator可以访问和修改它的状态,外部对象不能访问和修改它。
  • Caretaker(管理者):负责保存和恢复Originator的状态。它保存了Originator的历史状态列表,并提供了一个接口来保存和恢复这些状态。

这些角色协同工作,使得Originator对象可以在不暴露其实现细节的情况下保存和恢复其状态。备忘录模式提供了一种灵活的方式,可以在多个时间点保存对象的状态,并可以在以后的某个时间点恢复到任何先前的状态。

下面使用C#实现一个简单备忘录模式:

定义原发器类

代码语言:javascript复制
public  class  Originator
{
    private  string state;

    public  string State
    {
        get { return state; }
        set 
        { 
            state = value; 
            Console.WriteLine("State set to: "   state); 
        }
    }

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

    public void RestoreState(Memento memento)
    {
        state = memento.State;
        Console.WriteLine("State restored to: "   state);
    }
}

定义备忘录

代码语言:javascript复制
public  class  Memento
{
    private  string state;

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

    public  string State
    {
        get { return state; }
    }
}

定义管理者

代码语言:javascript复制
public  class  Caretaker
{
    private List<Memento> mementoList = new List<Memento>();

    public void SaveState(Memento state)
    {
        mementoList.Add(state);
    }

    public Memento RestoreState(int stateNumber)
    {
        return mementoList[stateNumber];
    }
}

调用代码:

代码语言:javascript复制
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();

originator.State = "State 1";
originator.State = "State 2";
caretaker.SaveState(originator.SaveState());

originator.State = "State 3";
caretaker.SaveState(originator.SaveState());

originator.State = "State 4";
Console.WriteLine("Current state: "   originator.State);

// 恢复到之前的状态
originator.RestoreState(caretaker.RestoreState(1));
Console.WriteLine("Restored state: "   originator.State);

输出结果:

代码语言:javascript复制
State set to: State 1
State set to: State 2
State set to: State 3
State set to: State 4
Current state: State 4
State restored to: State 3
Restored state: State 3

在这个例子中,Originator是一个保存状态的对象,它的状态被保存到Memento对象中。Caretaker保存了Originator的历史状态列表,并提供了保存和恢复这些状态的方法。当需要恢复之前的状态时,Caretaker通过调用RestoreState方法来获取Memento对象,并将其传递给OriginatorRestoreState方法,从而将Originator恢复到之前的状态。

结论

备忘录模式的优点是它可以在不暴露对象实现细节的情况下保存和恢复对象的状态。它还允许对象在多个时间点保存它的状态,并恢复到之前的任何时间点。缺点是如果保存的状态非常大,它可能会占用大量的内存。此外,备忘录模式会增加代码的复杂性和开销。

在实际应用中,备忘录模式通常与其他模式一起使用,例如命令模式和状态模式,以实现更复杂的行为。

0 人点赞