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());
        }
    }
    
  • 相关阅读:
    python sys.argv[]
    python 继承
    python 类/对象
    Formily教程 | formily是中后台复杂场景的表单解决方案
    如何保障消息100%投递成功?如何保证消息幂等性
    rabbitmq延时重试队列
    IO多路复用之select、poll、epoll详解
    构建PHP微服务生态
    flutter dio 处理200以为的错误状态码
    [git] 如何查看 .patch 文件
  • 原文地址:https://www.cnblogs.com/liushijie/p/4778291.html
Copyright © 2011-2022 走看看