JAVA-设计模式-备忘录模式

后端 · 2020-11-17 ·

在现实生活中,我们玩仙剑游戏的时候,玩家只要死了,必须从头开始,但是有的时候我们前面辛辛苦苦过关的我们又不想浪费时间重新开始,于是游戏开发者给我们提供一个存档的功能吗,这个功能由“备忘录模式”来实现的。

其实很多软件都提供了这项功能,如Word/PHOTOSHOP/Eclipse等软件在编辑的时按 Ctrl+Z 组合键时能撤销当前操作。

备忘录模式能记录一个对象的内部状态,当用户想要撤销时,可以恢复到它原先的状态

定义

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

角色


备忘录模式的主要角色如下:

  1. 发起人角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录的所有信息。
  2. 备忘录角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  3. 管理者角色:对备忘录进行管理,提供保存和获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

代码

package xin.mla.memento;

public class MementoTest {

    public static void main(String[] args) {
        Caretaker caretaker = new Caretaker();
        Originator og = new Originator("打败了4级怪兽", 4);
        System.out.println("标签:" + og.getTitle() + "当前关卡" + og.getStep());
        caretaker.setMemento(og.memento());// 备份
        og.setTitle("打败了5级怪兽");
        og.setStep(5);
        System.out.println("当前状态:" + og.getTitle());
        og.setTitle("打6级怪兽,没有打过");
        og.setStep(1);
        System.out.println("当前状态:" + og.getTitle() + ",重新开始从" + og.getStep() + "开始");
        System.out.println("前四级虽然比较简单,但是耗时间,幸好我有备份,从第5级再继续");
        og.recovery(caretaker.getMemento());
        System.out.println("当前状态:" + og.getTitle() + ",重新开始从" + og.getStep() + "开始");

    }

}

// 发起人角色
class Originator {
    private String title;
    private int step;

    // 进行备份操作,返回备忘录对象
    public Memento memento() {
        return new Memento(this);
    }

    // 进行恢复操作
    public void recovery(Memento memento) {
        this.title = memento.getTitle();
        this.step = memento.getStep();
    }

    public Originator(String title, int step) {
        this.title = title;
        this.step = step;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getStep() {
        return step;
    }

    public void setStep(int step) {
        this.step = step;
    }
}

// 备忘录角色
class Memento {
    private String title;
    private int step;

    public Memento(Originator og) {
        this.title = og.getTitle();
        this.step = og.getStep();
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getStep() {
        return step;
    }

    public void setStep(int step) {
        this.step = step;
    }
}

// 管理者角色
class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

优点

  1. 提供了一种可以恢复状态的机制。
  2. 实现了内部状态的封装,除了创建它的发起人之外,其他对象都不能访问这些状态。
  3. 简化了发起人类,发起人不需要管理和保存内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

缺点

  1. 资源消耗大,如果要保存的内部状态信息过多或者多次备份,将会占用比较大的内存资源。
%