• Behavioral模式之Memento模式


    1.意图

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

    2.别名

    Token

    3.动机

    有时候有必要记录一个对象的内部状态。为了同意用户取消不确定的操作或从错误中恢复过来,须要实现检查点和取消机制,而要实现这些机制。你必须事先将状态信息保存在某处,这样才干是对象恢复到他们先前的状态。

    4.适用性

    下面情况使用Memento模式:

    • 必需保存一个对象在某一时刻的(部分)状态,这样以后须要时它能恢复到先前的状态。
    • 如果一个用接口来让其他对象直接得到这些状态。将会暴露对象的实现细节并破坏对象的封装性。

    5.结构

    主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人认为叫备份模式更形象些,通俗的讲下:如果有原始类A。A中有各种属性,A能够决定须要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢。就是一个用来存储备忘录的。且仅仅能存储,不能改动等操作。做个图来分析一下:
    Memento模式

    6.代码演示样例

    Original类是原始类。里面有须要保存的属性value及创建一个备忘录类。用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类。持有Memento类的实例,该模式非常好理解。

    直接看源代码:
    实现代码:
    数据结构:

    public class Original {
    
        private String value;
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public Original(String value) {
            this.value = value;
        }
    
        public Memento createMemento(){
            return new Memento(value);
        }
    
        public void restoreMemento(Memento memento){
            this.value = memento.getValue();
        }
    }

    实现:

    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;
        }
    }
    
    
    public class Storage {
    
        private Memento memento;
    
        public Storage(Memento memento) {
            this.memento = memento;
        }
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    測试类:
    

    public class Test {

    public static void main(String[] args) {
    
        // 创建原始类
        Original origi = new Original("egg");
    
        // 创建备忘录
        Storage storage = new Storage(origi.createMemento());
    
        // 改动原始类的状态
        System.out.println("初始化状态为:" + origi.getValue());
        origi.setValue("niu");
        System.out.println("改动后的状态为:" + origi.getValue());
    
        // 回复原始类的状态
        origi.restoreMemento(storage.getMemento());
        System.out.println("恢复后的状态为:" + origi.getValue());
    }
    

    }
    “`
    输出:
    初始化状态为:egg
    改动后的状态为:niu
    恢复后的状态为:egg
    简单描写叙述下:新建原始类时,value被初始化为egg,后经过改动,将value的值置为niu。最后倒数第二行进行恢复状态,结果成功恢复了。事实上我认为这个模式叫“备份-恢复”模式最形象。

    7.相关模式

    • Command模式:命令模式能够使用备忘录来为可撤销的操作维护状态。
    • Iterator模式:如前所述备忘录可用于迭代。

    引用:

    http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
    http://item.jd.com/10057319.html
    http://blog.csdn.net/zhangerqing/article/details/8239539

  • 相关阅读:
    phpexcel 导入超过26列、处理时间格式
    PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers
    关于微信支付服务器证书更换的提醒
    PHP微信开发之模板消息回复
    js---用对象来放置变量和方法
    electron---更改安装图标
    css---【vw,vh】进行自适应布局单位
    vue---父子组件之间的通信【props,$refs、$emit】
    vue---props进行双向数据绑定报错
    ES6----拓展运算符 三个点【...】
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7190787.html
Copyright © 2020-2023  润新知