zoukankan      html  css  js  c++  java
  • 设计模式学习笔记十九:备忘录模式

    设计模式学习笔记十九:备忘录模式

    介绍

    备忘录(MEMENTO)模式属于对象行为型模式。主要用来对象状态的备份,可以理解为对象快照副本。当需要的时候可以从副本中回滚。

    优点

    • 回滚具备了数据恢复能力

    缺点

    • 需要占用额外的内存空间
    • 对象复杂备份耗时多

    使用场景

    需要存储状态的场景,比较数据快照。

    UML结构图:

    Memento

    代码实现

    1.定义原发器,就是创建备忘录的那个对象,一般也是要进行备忘的对象。提供创建备忘录和回复备忘录的调用入口。即Originator:

    public class Originator {
        private String action;
    
        public Originator() {
            this.action = action;
        }
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
            System.out.println(this.action);
        }
    
        public Memento createMemento(String action) {
            Memento memento = new Memento();
            memento.setAction(action);
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.action = memento.getAction();
            System.out.println("执行回滚......");
        }
    }
    

    2.备忘录存储对象,可以是其他介质。即Memento:

    public class Memento {
        String action;
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    }
    

    3.备忘录管理者,一个POJO对象,即Caretaker

    public class Caretaker {
        private final Memento memento;
        public Caretaker(Memento memento) {
            this.memento = memento;
        }
    
        public Memento getMemento() {
            return memento;
        }
    }
    

    5.测试调用,TestDrive

    public class Run {
        public static void main(String[] args) {
            Originator originator = new Originator();
            originator.setAction("执行操作:向前一步走");
            System.out.println("当前状态:" + originator.getAction());
    
            Memento memento = originator.createMemento(originator.getAction());
    
            Caretaker caretaker = new Caretaker(memento);
    
            originator.setAction("执行操作:向左一步走");
            originator.setMemento(caretaker.getMemento());
            System.out.println("当前操作状态:" + originator.getAction());
        }
    }
    
  • 相关阅读:
    动态规划精讲(一)53. 最大子序和
    ACM计算几何总结
    三角形外心的坐标公式
    三角形外心的坐标公式
    高精度模板
    位运算模板
    同余定理与逆元
    扩展欧几里得算法求二元一次方程
    1004. 最大连续1的个数 III
    剑指 Offer 04. 二维数组中的查找
  • 原文地址:https://www.cnblogs.com/liushijie/p/4778291.html
Copyright © 2011-2022 走看看