美文网首页
备忘录模式

备忘录模式

作者: 全栈未遂工程师 | 来源:发表于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