写点什么

设计模式 - 备忘录模式

作者:Java你猿哥
  • 2023-04-11
    湖南
  • 本文字数:974 字

    阅读完需:约 3 分钟

备忘录模式( Memento Pattern )又称为快照模式( Snapshot Pattern )或令牌模式( Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,井在对象之外保存这个状 态。这样以后就可将该对象恢复到原先保存的状态,属于行为型模式。

有点类似于“后悔药”给我们程序的开发提供后悔药,当某个功能(应为一些严重的 bug)我们不想要了我们可以撤回到没开发这个功能的状态.

适用场景

  1. 需要保存历史快照的场景

  2. 希望在对象之外保存状态,且除了自己其他类对象无法访问状态保存具体内容。

就比如我们经常使用的 svn、git 就是个典型的备忘录模式实现,可以提交代码,可以回滚代码。(实际的开发中该模式用的还是很少的)

UML 类图


具体代码如下:

@Getter@Setter@ToStringpublic class Originator {    private String state;
public Memento saveToMemento(){ return new Memento(state); }
public void restoreMemento(Memento memento){ this.state = memento.getState(); }}
复制代码


@Getter@Setter@ToStringpublic class Memento {    private String state;
public Memento(String state){ this.state = state; }}
复制代码


public class Caretaker {    private final Stack<Memento> stack = new Stack<Memento>();
public void addMemento(Memento memento) { stack.push(memento); }
public Memento getMemento() { return stack.pop(); }}
复制代码

备忘录管理者这里采用了栈的存储方式

public class Test {    public static void main(String[] args) {        Originator originator = new Originator();        originator.setState("1");        Caretaker caretaker = new Caretaker();        caretaker.addMemento(originator.saveToMemento());        originator.setState("2");        originator.setState("3");        System.out.println(originator);        originator.restoreMemento(caretaker.getMemento());        System.out.println(originator);    }}
复制代码


备忘录模式的优缺点:

优点:

  1. 简化发起人实体类(Originator)职责,隔离状态存储与获取,实现了信息的封装,客户端 无需关心状态的保存细节;

  2. 提供回滚功能

缺点:

  1. 消耗资源:如果需要保存的状态过多时,每一次保存都会消耗很多内存。

用户头像

Java你猿哥

关注

一只在编程路上渐行渐远的程序猿 2023-03-09 加入

关注我,了解更多Java、架构、Spring等知识

评论

发布
暂无评论
设计模式-备忘录模式_Java_Java你猿哥_InfoQ写作社区