Memento Patterns

GoF定义:在不破坏(类)封装的情况下,获取一个对象当前的状态,使得之后这个对象可以恢复成这个状态

概念

目的是为了保存对象当前的状态,这样在之后可以恢复成这个状态。这个模式中有三个角色,分别为备忘录(memento),看管人(caretaker),创始人(originator)。备忘录会存储创始人(对象)的状态,创始人可以保存自己的内部状态并且可以恢复成历史的状态。创始人也可以从备忘录获取数据来恢复状态。看管人负责备忘录的安全并且不查看备忘录的内容

例子

现实世界:我们经常使用撤销快捷键(cmd+z)
代码世界:有限状态机(研究有限内存情况下的计算而抽象出来的计算模型),事务回滚

展示

代码

public class MementoPatternEx
{
    public static void main(String[] args)
    {
        System.out.println("***Memento Pattern Demo***\n");
        Originator o = new Originator();
        o.setState("First state");
        // Holding old state
        Caretaker c = new Caretaker();
        c.setMemento(o.originatorMemento());
        //Changing state
        o.setState("Second state");
        // Restore saved state
        o.Revert(c.getMemento());
    }
}

class Caretaker
{
    private Memento memento;

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

    public Memento getMemento()
    {
        return memento;
    }
}

class Memento
{
    private String state;

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

    public String getState()
    {
        return state;
    }
}

class Originator
{
    private String state;
    private Memento memento;

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

    public Memento originatorMemento()
    {
        this.memento = new Memento(this.state);
        return this.memento;
    }

    public void Revert(Memento memento)
    {
        System.out.println("Restoring to previous state...");
        this.state = memento.getState();
        System.out.println("State at present :" +state);
    }
}

Note

  1. 建议Memento对象是不透明对象,即Caretaker对象不能修改它
  2. 要特别注意,不能让Originator对象的改变影响到Memento对象的状态
  3. 有时这个模式的性能开销可能很大(状态的内容很多),而且在1的限制下,Caretaker对象不知道状态中哪些部分是可以删除的

思考

代码内实现对象的快照功能,基本是备忘录和原对象即可完成功能,照看者的角色是不希望原对象保存自己的状态两次(备忘录一次,本身一次)而出现的

posted on 2020-12-04 22:18  老鼠不上树  阅读(47)  评论(0)    收藏  举报