备忘录模式,是怎么记住状态的?

2022-05-07  本文已影响0人  程就人生

备忘录模式,是怎么记住状态的,你知道吗?

在什么情况下,我们可以使用备忘录模式?

备忘录模式(Memento Pattern),在不破坏一个对象的前提下,捕获对象的内部状态,并保持在对象外部,以便在需要的时候,恢复该对象状态。它是一种行为型模式。

业务场景:需要保持、恢复数据的相关状态场景。

优点:给用户提供一个恢复状态的机制;缺点:恢复的状态越多,浪费的内存越多。

关键代码:发起人、备忘录类,备忘录管理类。

下面看UML类图:


UML类图说明:Memento是备忘录,负责存储Originator的内部状态。MementoManager是备忘录的管理类,它聚合了Memento备忘录。Originator是发起人,它依赖Memento备忘录类。

三个对象,两种关系。发起人与备忘录类是依赖关系,发起人依赖备忘录类,备忘录类存储它的内部状态。备忘录类与备忘录管理类之间是聚合关系,备忘录管理类聚合了备忘录类。备忘的状态最终交给备忘录管理类保存。

下面看代码实现步骤:
1.备忘录类,负责存储发起人的内部状态;

/**
 * 1. 备忘录类
 * @author 程就人生
 * @Date
 */
public class Memento {
  
    // 需要保存的状态
  private String state;

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

  public String getState() {
    return state;
  }
}

2.备忘录管理类,负责管理备忘录类;

import java.util.ArrayList;
import java.util.List;

/**
 * 2.备忘录管理者
 * @author 程就人生
 * @Date
 */
public class MementoManager {

  private List<Memento> mementoList = new ArrayList<Memento>();
  
  // 添加备忘录
  public void addMemento(Memento memento){
    mementoList.add(memento);
  }
  // 获取某一次存储的状态
  public Memento getMemento(int index){
    return mementoList.get(index);
  }
}

3.发起人,负责保存当前的状态;


public static void main(String[] argo){
    // 备忘状态的对象
    Originator originator = new Originator();
    // 备忘录管理者
    MementoManager mementoManager = new MementoManager();
    // 第一次设置的状态
    originator.setState("state #1");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    
    // 第二次设置状态
    originator.setState("state #2");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    // 第二次设置状态
    originator.setState("state #3");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    // 第二次设置状态
    originator.setState("state #4");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    // 第二次设置状态
    originator.setState("state #5");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    
    System.out.println("当前的状态:" + originator.getState());
    
    // 从备忘录中获取所存储的状态
    originator.getStateToMemento(mementoManager.getMemento(1));
    
    System.out.println("恢复到第二次的状态:" + originator.getState());
  }

4.测试代码;

public static void main(String[] argo){
    // 备忘状态的对象
    Originator originator = new Originator();
    // 备忘录管理者
    MementoManager mementoManager = new MementoManager();
    // 第一次设置的状态
    originator.setState("state #1");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    
    // 第二次设置状态
    originator.setState("state #2");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    // 第二次设置状态
    originator.setState("state #3");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    // 第二次设置状态
    originator.setState("state #4");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    // 第二次设置状态
    originator.setState("state #5");
    // 保存状态到备忘录中
    mementoManager.addMemento(originator.saveStateToMemento());
    
    System.out.println("当前的状态:" + originator.getState());
    
    // 从备忘录中获取所存储的状态
    originator.getStateToMemento(mementoManager.getMemento(1));
    
    System.out.println("恢复到第二次的状态:" + originator.getState());
  }

运行结果:

当前的状态:state #5
恢复到第二次的状态:state #2

这段代码的意思是:发起人更改过很多次状态,每次更改状态时,进行了备忘,并交给备忘录管理类进行管理。如果想恢复某次的状态,则通过备忘录管理类通过索引获取即可。以上便是备忘录模式的简单实现。

最后总结

备忘录模式,强调历史状态的保持与恢复。最主要的类是状态管理的备忘录类和备忘录管理者。

思考题:在日常工作中,你都遇到了哪些备忘录的使用场景?

上一篇 下一篇

猜你喜欢

热点阅读