• GoF 23 备忘录模式


    备忘录模式(memento)
    行为模式的一种。
    意图:
    Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.
    在不破坏封装的前提下,捕获和外化一个对象的内部状态,这样以后就可以将该对象恢复到原先保存的状态。

    结构图
    请添加图片描述
    参与者
    Memento (SolverState)

    • 存储 Originator 对象的内部状态。Memento可以存储为由Originator自行决定是否需要或多或少的Originator的内部状态。
    • 防止发起者以外的对象访问。Memento实际上有两个接口。Caretaker看到了一个狭窄的界面Memento——它只能将 memento 传递给其他对象。Originator,在相比之下,看到一个广泛的界面,一个允许它访问所有必要的数据的界面将自身恢复到之前的状态。理想情况下,只有产生memento的Originator 才被允许访问 memento 的内部状态。

    Originator(ConstraintSolver)

    • 创建一个包函当前内部状态快照的memento
    • 用memento恢复其内部状态

    Caretaker (undo mechanism)

    • 负责memento的保存
    • 从不操作和检查memento的内容
    public class Caretaker {
    
        Memento memento;
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    
    
    public class Memento {
        private  String state;
        public Memento(String state) {
            this.state = state;
        }
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
    }
    
    
    
    public class Originator {
    
        private  String state;
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        Memento creatMemento(){
            return new Memento(state);
        }
    
        void setMemento(Memento m){
               this.setState(m.getState());
        }
    
        @Override
        public String toString() {
            return "Originator{" +
                    "state='" + state + '\'' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    测试类

    public class test {
        public static void main(String[] args) {
            Originator or = new Originator();
            or.setState("s1");
            System.out.println("原始状态"+or.toString());
            Memento m = or.creatMemento();
    
            System.out.println("开始备份");
            Caretaker cr = new Caretaker();
            cr.setMemento(m);
    
            or.setState("s2");
            System.out.println("修改状态为"+or.toString());
    
    
            or.setMemento(cr.getMemento());
            System.out.println("恢复状态"+or.toString());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    执行结果
    请添加图片描述

    参考文档http://www.javier8a.com/itc/bd1/articulo.pdf

  • 相关阅读:
    Redis学习第九天
    PHP之简单实现MVC框架
    Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional
    知识分享应用-后端代码从0构建
    SAP Table function 执行报错 code CX_SQL_EXCEPTION feature not supported 该如何分析
    SQL刷题查漏补缺5
    常见算法题分类总结之二分算法(Binary-Search):致敬经典,超越经典
    socket() failed (24: Too many open files) while connecting to upstream, client
    单克隆抗体WuT9/甘草次酸-氟尿嘧啶偶联顺铂/RGD肽修饰聚谷氨酸-顺铂复合物的制备
    JS垃圾回收
  • 原文地址:https://blog.csdn.net/loveme888/article/details/125910717