设计模式(行为型设计模式——备忘录模式)

设计模式(行为型设计模式------备忘录模式)

备忘录模式

基本定义

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

模式结构

  • Originator:原发器。负责创建一个备忘录,用以记录当前对象的内部状态,也可以使用它来利用备忘录恢复内部状态。同时原发器还可以根据需要决定Memento存储Originator的那些内部状态。

  • Memento: 备忘录。用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento。在备忘录Memento中有两个接口,其中Caretaker只能看到备忘录中的窄接口,它只能将备忘录传递给其他对象。Originator可以看到宽接口,允许它访问返回到先前状态的所有数据。

  • Caretaker: 负责人。负责保存好备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

代码实现

Originator:原发器
java 复制代码
//Originator 原发器
@Getter
@Setter
@Slf4j
public class Role {
    private int level;//等级
    private int blood;//血量

    public Role(int level, int blood) {
        this.level = level;
        this.blood = blood;
    }

    public void display(){
        log.info("当前状态:等级 {}, 血量 {}", level, blood);
    }

    //恢复之前的状态
   
    public void restore(Memento memento){
        this.level = memento.getLevel();
        this.blood = memento.getBlood();
    }

    //创建备忘录
    public Memento createMemento(){
        return new Memento(this.level, this.blood);
    }
}
Memento: 备忘录
java 复制代码
@Data
public class Memento {
    private int level;//等级
    private int blood;//血量

    public Memento(int level, int blood) {
        this.level = level;
        this.blood = blood;
    }
}
Caretaker: 负责人
java 复制代码
/**
 * @Description 负责人
 * 1、负责人保存备忘录
 * 2、负责人传递备忘录
 * 3、不能对备忘录内容操作/访问
 **/
@Setter
@Getter
public class Caretaker {
    Memento memento;
}
测试类
java 复制代码
@Slf4j
public class Test {
    public static void main(String[] args) {
        Role role = new Role(10, 90);
        log.info("第一关通关, 开始存档");
        role.display();

        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(role.createMemento());

        //继续闯关. 第二关BOSS
        log.info("继续闯关. 第二关BOSS");
        role.setLevel(15);
        role.setBlood(10);
        role.display();

        //恢复存档
        log.info("打不过BOSS, 恢复存档");
        role.restore(caretaker.getMemento());
        role.display();
    }
}
输出结果

第一关通关, 开始存档

当前状态:等级 10, 血量 90 继续闯关.

第二关BOSS

当前状态:等级 15, 血量 10 打不过BOSS,

恢复存档 当前状态:等级 10, 血量 90

优点
  • 给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态。

  • 实现了信息的封装。使得用户不需要关心状态的保存细节。

缺点

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景
  • 需要保存一个对象在某一个时刻的状态或部分状态。

  • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态。

模式总结
  • 备忘录模式可以实现在不破坏封装的前提下,捕获一个类的内部状态,并且在该对象之外保存该对象的状态,保证该对象能够恢复到历史的某个状态。
  • 备忘录模式实现了内部状态的封装,除了创建它的原发器之外其他对象都不能够访问它。
  • 备忘录模式会占用较多的内存,消耗资源。
相关推荐
保持学习ing3 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者15 分钟前
Java的SPI机制详解
java
超级小忍37 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug41 分钟前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享43 分钟前
Java Lombok 入门
java
程序无bug43 分钟前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队44 分钟前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢1 小时前
Maven
java·maven·intellij-idea
考虑考虑1 小时前
Maven 依赖范围(Scope)
java·后端·maven
张小洛1 小时前
Spring AOP 设计解密:代理对象生成、拦截器链调度与注解适配全流程源码解析
java·后端·spring·spring aop·aop