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
java 复制代码
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
java 复制代码
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
java 复制代码
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 测试主函数

java 复制代码
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. 使用场景

  • 当需要提供一种撤销机制,允许用户回退到之前的状态时
相关推荐
事圆则缓4 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
shehuiyuelaiyuehao4 小时前
算法50,分治归并,数组中的逆序对
java·算法
烽学长4 小时前
(附源码)基于Springboot+vue的图书阅读分享系统的设计与实现
java·spring boot·后端
Ivanqhz4 小时前
数据搬运是性能关键
java·服务器·网络·人工智能·深度学习
青山木4 小时前
RocketMQ 入门到原理(三):消息存储原理
java·后端·中间件·架构·rocketmq
MayBaymax4 小时前
Spring AI Alibaba Graph 实战:客服工单智能处理
java·ai·ai编程
光依旧5 小时前
MCP实战手记系列(五):让工具返回一个能点的界面(文末附github源码链接)
java·spring ai·前端集成·mcp·mcp apps
APIshop5 小时前
淘宝选品接口实战:从召回、详情、佣金到转链的 Java 接入笔记
java
泡茶喝茶写代码5 小时前
量化数据进阶:多维实战篇(第 11 篇):历史涨跌停价:涨跌停序列与止损线测算
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
景熙55235 小时前
单体项目编写思路和落地形式
java·开发语言