“状态变化”模式之 Memento模式(备忘录)

1. 动机

  • 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需求,需要程序能够重新回溯到对象之间某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。
  • 如何实现对象状态的良好保存和恢复?但同时又不会因此而破坏对象本身的封装性。

2. 模式定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

                                                                                                -----设计模式 GOF

3. 示例代码

class Momento
{
    // 这个和下面类需要保存的状态是对应的
    string state;
public:
    Momento(const string &s)
    : state(s)
    {
    }

    string GetState(){
        return state;
    }

    void SetState(const string &s)
    {
        state = s;
    }

};

// 需要备忘的类
class Originator
{
    // 需要保存的状态
    string state;
    // ...
public:
    Originator(){}

    Momento CtreateMemto(){
        Momento m(state);
        return m;
    }

    void SetMomento(const Momento &m){
        state = m.GetState();
    }

};

void main(){
    Originator originator; //
    
    // 捕获对象状态,存储到备忘录
    auto momento = originator.CtreateMemto();

    // originator状态修改
    // ...

    // 从备忘录中恢复状态
    originator.SetMomento(momento)

}

4. 结构

上图的Catetaker就是我们上面代码的main函数

 5. 要点总结

  • 备忘录(momento)存储原发器(Originator)对象的内部状态,在需要的时候恢复原发器状态
  • momento模式的核心是信息隐藏,即Originator需要向外隐藏信息,保持其封装性。但同时又需要将状态保持到外界(Momento)
  • 这个模式看起来有点过时,因为我们有很多序列化的手段,但是我们需要知道该模式的思想

猜你喜欢

转载自blog.csdn.net/bocai1215/article/details/127920296
今日推荐