备忘录模式

283 阅读1分钟

概念

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

使用场景

  • 需要保存对象在某个时刻的状态,提供可以恢复状态的机制
  • 一个对象不希望外界直接访问其内部状态,要通过中间对象来间接访问

实现方式

  • Originator —— 发起人角色,创建备忘录,用于记录恢复自身内部状态,也包含业务逻辑
  • Memento —— 备忘录角色,用于存储Originator内部状态,可以防止Originator以外的对象访问Memento
  • Caretaker—— 存储备忘录容器,不能操作访问备忘录内容,只将备忘录传给其他对象
public class Originator{
    private int state;

    // 创建备忘录
    public Memento createMemento(){
        Memento m= new Memento();
        m.mState = this.state;
        return m;
    }

    // 恢复状态
    public void restore(Memento m){
        this.state = m.mState;
    }

    // 业务逻辑
    public void play(int n){
        state = n;
    }
}

public class Memento {
    public int mState;
    public void setState(int state){
        mState = state;
    }

    public int getState(){
        return mState;
    }
}

public class Caretaker {
    Memento m;
    public void setMemento(Memento state){ //存档
        m = state;
    }
    public Memento getMemento(){
        return m;
    }
}

public class Test {
    public static void main(String[] args){
        Originator game = new Originator();
        game.play(3); //打三分钟游戏
        Caretaker c = new Caretaker();
        c.setMemento(game.createMemento()); //存档

        Originator newgame = new Originator(); //重新游戏
        newgame.restore(c.getMemento()); //恢复游戏数据
    }
}