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

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

备忘录模式

基本定义

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

模式结构

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

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

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

代码实现

Originator:原发器
//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: 备忘录
@Data
public class Memento {
    private int level;//等级
    private int blood;//血量

    public Memento(int level, int blood) {
        this.level = level;
        this.blood = blood;
    }
}
Caretaker: 负责人
/**
 * @Description 负责人
 * 1、负责人保存备忘录
 * 2、负责人传递备忘录
 * 3、不能对备忘录内容操作/访问
 **/
@Setter
@Getter
public class Caretaker {
    Memento memento;
}
测试类
@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

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

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

缺点

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

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

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

模式总结
  • 备忘录模式可以实现在不破坏封装的前提下,捕获一个类的内部状态,并且在该对象之外保存该对象的状态,保证该对象能够恢复到历史的某个状态。
  • 备忘录模式实现了内部状态的封装,除了创建它的原发器之外其他对象都不能够访问它。
  • 备忘录模式会占用较多的内存,消耗资源。

相关推荐

  1. 行为设计模式备忘录模式

    2024-03-22 08:52:05       42 阅读
  2. 设计模式行为设计模式——备忘录模式

    2024-03-22 08:52:05       44 阅读
  3. 笨蛋学设计模式行为模式-备忘录模式【22】

    2024-03-22 08:52:05       48 阅读
  4. GO设计模式——20、备忘录模式行为

    2024-03-22 08:52:05       67 阅读
  5. 设计模式: 行为备忘录模式(13)

    2024-03-22 08:52:05       40 阅读
  6. 设计模式(020)行为备忘录模式

    2024-03-22 08:52:05       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 08:52:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 08:52:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 08:52:05       82 阅读
  4. Python语言-面向对象

    2024-03-22 08:52:05       91 阅读

热门阅读

  1. 【Django】CORS跨域问题

    2024-03-22 08:52:05       40 阅读
  2. K8S node磁盘清理

    2024-03-22 08:52:05       41 阅读
  3. Redis基本简介

    2024-03-22 08:52:05       40 阅读
  4. Linux 技术深潜:细解top命令的全方位使用教程

    2024-03-22 08:52:05       41 阅读
  5. 动态规划 Leetcode 123 买卖股票的最佳时机III

    2024-03-22 08:52:05       47 阅读
  6. How to install PyAlink on Ubuntu 22.04

    2024-03-22 08:52:05       37 阅读
  7. Ubuntu---之进程/线程管理命令

    2024-03-22 08:52:05       40 阅读
  8. 请解释 VB.NET 中的事件(Event)

    2024-03-22 08:52:05       34 阅读