美文网首页
备忘录模式

备忘录模式

作者: 全栈未遂工程师 | 来源:发表于2016-03-24 11:10 被阅读46次

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

备忘录模式结构图

Memento(备忘录):负责存储Originator对象的内部状态,防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
使用场景:

  • Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类。
  • 如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。
  • 角色状态改变时,如果先状态无效,那么可以使用备忘录模式将这个状态恢复。
package com.memento;

public class Original {
//这个类的一些状态需要保存
    private String value;
    public Original(String value) {
        this.value = value;
    }
    public Memento createMemento(){
        return new Memento(value);
    }
    public void restoreMemento(Memento m){
        this.value = m.getValue();
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
    
}

package com.memento;

public class Memento {
//一个备忘录对象
    private String value;
    public Memento(String value){
        this.value = value;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}
package com.memento;

public class Storage {
//存储备忘录对象
    private Memento memento;

    public Storage(Memento memento) {
        super();
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }

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

package com.memento;
/**
 * ClassName: Main 
 * @Description:备忘录模式(Memento):
 * 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,
 * Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。
 * Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。 
 * @author Panyk
 * @date 2015年10月15日
 */
public class Main {
    public static void main(String[] args) {
        //创建原始类
        Original o = new Original("egg");
        //创建备忘录
        Storage s = new Storage(o.createMemento());
        //修改原始类值
        System.out.println("原始值="+o.getValue());
        o.setValue("new value");
        System.out.println("更新值="+o.getValue());
        //恢复原始值
        o.restoreMemento(s.getMemento());
        System.out.println("恢复值=" + o.getValue());
    }
}

相关文章

网友评论

      本文标题:备忘录模式

      本文链接:https://www.haomeiwen.com/subject/dtdrlttx.html