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());
        }
    }
    
  • 相关阅读:
    敏感词过滤
    Tarjan+topsort(DP)【P3387】 [模板]缩点
    树状数组【CF703D】Mishka and Interesting sum
    组合数学+错排问题【p4071】[SDOI2016]排列计数
    Dijkstra【p3003(bzoj2100)】[USACO10DEC]苹果交货Apple Delivery
    Trie树【p2264】情书
    线段树+扫描线【p1884】[Usaco12FEB]过度种植(银)Overplanting …
    区间DP【p4290】[HAOI2008]玩具取名
    暴力 【p4092】[HEOI2016/TJOI2016]树
    暴力 【p4098】[HEOI2013]ALO
  • 原文地址:https://www.cnblogs.com/liushijie/p/4778291.html
Copyright © 2011-2022 走看看