行为型设计模式 - 备忘录模式详解

基本介绍

备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。这样就能够将该对象恢复到原先保存的状态java

模式结构

Originator(发起者):记录当前的状态,负责建立和恢复备忘录数据库

Memento(备忘录):负责存储发起者的状态,在须要的时候提供发起人须要的状态浏览器

Caretaker(管理者):管理备忘录数据结构

代码演示

(这里咱们以单角色、单状态、单备份来演示,思想是相同的,无非是存储数据结构上的区别)测试

备忘录角色,定义了存储状态的变量,能够根据实际需求定义对应的存储对象this

public class Memento {
    private String state;

    public String getState() {
        return state;
    }

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

发起者角色,存储状态,而且能够建立备忘录和将状态恢复为备忘录的值rest

public class Originator {
    private String state;

    public String getState() {
        return state;
    }

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

    public Memento createMemento() {
        Memento memento = new Memento();
        memento.setState(state);
        return memento;
    }

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

管理者角色,管理了备忘录code

public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

测试类对象

public class Client {
    @Test
    public void test() {
        //设置初始状态
        Originator originator = new Originator();
        originator.setState("状态1");
        System.out.println("初始状态:" + originator.getState());

        //建立管理者
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

        //更新状态
        originator.setState("状态2");
        System.out.println("跟新状态:" + originator.getState());

        //恢复状态
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("恢复状态:" + originator.getState());
    }
}

运行结果游戏

初始状态:状态1
跟新状态:状态2
恢复状态:状态1

模式分析

优势:

  • 给用户提供了一种能够恢复状态的机制,使用户能够比较方便的回退到某个历史的状态
  • 实现了信息的封装,使用户不须要关心备忘录中状态的保存细节

缺点:

  • 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态须要存储到备忘录对象中,对资源的消耗是比较严重的,为了节约内存,能够配合原型模式使用

应用场景:

  • 游戏的存档
  • CTRL + Z 撤销
  • 浏览器的后退
  • 数据库的事务管理
  • ... ...
相关文章
相关标签/搜索