• Java特性之设计模式【备忘录模式】


    一、备忘录模式

    概述

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式

    备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态

    主要解决

    允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作

    何时使用

    • 需要实现对象状态的撤销和恢复功能。当需要在对象中实现撤销操作或者恢复到先前状态的功能时,备忘录模式是一种有效的设计模式。它可以让对象保存其内部状态的快照,并在需要时进行恢复,从而实现撤销和恢复的功能

    优缺点

    优点:

    • 提供状态恢复机制:允许用户方便地回到历史状态
    • 封装状态信息:用户不需要关心状态的保存细节

    缺点:

    • 资源消耗:如果对象的状态复杂,保存状态可能会占用较多资源

    1. 各个角色介绍

    1.1 备忘录(Memento)

    • 负责存储原发器对象的内部状态。备忘录可以保持原发器的状态的一部分或全部信息

    1.2 原发器(Originator)

    • 创建一个备忘录对象,并且可以使用备忘录对象恢复自身的内部状态。原发器通常会在需要保存状态的时候创建备忘录对象,并在需要恢复状态的时候使用备忘录对象

    1.3 负责人(Caretaker)

    • 负责保存备忘录对象,但是不对备忘录对象进行操作或检查。负责人只能将备忘录传递给其他对象

    2. UML图

    ​ 备忘录模式使用三个类 MementoOriginatorCareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态

    在这里插入图片描述

    3. 具体例子和代码

    角色分配

    • Memento:备忘录

    • Originator:原发器

    • Caretaker:负责人

    3.1 备忘录实体

    • Memento
    package com.vinjcent.prototype.memento;
    
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    /**
     * @author vinjcent
     * @description 备忘录
     * @since 2024/5/16 20:11
     */
    @Data
    public class Memento {
    
        @ApiModelProperty(value = "状态")
        private String state;
    
        public Memento(String state) {
            this.state = state;
        }
    
    }
    
    

    3.2 原发器实体

    • Originator
    package com.vinjcent.prototype.memento;
    
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    /**
     * @author vinjcent
     * @description 原发器
     * @since 2024/5/16 20:16
     */
    @Data
    public class Originator {
    
        @ApiModelProperty(value = "状态")
        private String state;
    
        public Memento saveStateToMemento() {
            return new Memento(state);
        }
    
        public void getStateFromMemento(Memento memento) {
            state = memento.getState();
        }
    
    }
    

    3.3 负责人

    • CareTaker
    package com.vinjcent.prototype.memento;
    
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author vinjcent
     * @description 负责人
     * @since 2024/5/16 20:23
     */
    @Data
    public class CareTaker {
    
        @ApiModelProperty(value = "备忘录列表")
        private List<Memento> mementoList = new ArrayList<Memento>();
    
        public void add(Memento state) {
            mementoList.add(state);
        }
    
        public Memento get(int index) {
            return mementoList.get(index);
        }
    
    }
    

    3.4 测试主函数

    package com.vinjcent.prototype.memento;
    
    /**
     * @author vinjcent
     * @description 备忘录模式
     * @since 2024/5/16 20:24
     */
    public class Main {
    
        public static void main(String[] args) {
    
            // 原发器
            Originator originator = new Originator();
    
            // 负责人
            CareTaker careTaker = new CareTaker();
            originator.setState("State #1");
            originator.setState("State #2");
    
            // 让负责人记录当前备忘录的状态
            careTaker.add(originator.saveStateToMemento());
            originator.setState("State #3");
    
            // 让负责人记录当前备忘录的状态
            careTaker.add(originator.saveStateToMemento());
            originator.setState("State #4");
    
            System.out.println("Current State: " + originator.getState());
            originator.getStateFromMemento(careTaker.get(0));
            System.out.println("First saved State: " + originator.getState());
            originator.getStateFromMemento(careTaker.get(1));
            System.out.println("Second saved State: " + originator.getState());
    
        }
    
    }
    
    
    • 测试结果
      在这里插入图片描述

    4. 使用场景

    • 当需要提供一种撤销机制,允许用户回退到之前的状态时

    在这里插入图片描述

  • 相关阅读:
    单元测试:模块接口、局部数据结构、路径、边界条件、错误处理、代码书写规范
    SpringMvc第四战-【SpringMvc文件上传,下载】
    智慧城市井盖选择,智能井盖传感器特点介绍
    【golang学习笔记】并发基础
    Vue的vant notify组件报错Notify is not defined
    【科研论文】Endnote入门指南
    c#基础0-类型、起步
    数据可视化-ECharts Html项目实战(14)
    K8s 集群部署过程文档
    抖音最新图文带货玩法实操分享!
  • 原文地址:https://blog.csdn.net/Wei_Naijia/article/details/139280356