Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

    • 设计模式的概念
    • 创建型模式
    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂(Factory)模式
    • 建造者(Builder)模式
    • 结构型模式(Structural Pattern)
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 装饰器模式(Decorator、Wrapper(包装) Pattern)
    • 代理模式(Proxy Pattern)
    • 外观模式(Facade Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 行为型模式(Behavioral Patterns)
    • 模板方法(Template Method)
    • 策略(Strategy)模式
    • 状态(State)模式
    • 中介者(Mediator)模式
    • 观察者(Observer)模式
    • 备忘录(Memento)模式
      • 应用场景
      • 注意事项和细节
    • 解释器(Interpreter)模式
    • 命令(Command)模式
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 职责链(Chain of Responsibility)模式
    • 总结
  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • 设计模式
Iekr
2023-12-10
目录

备忘录(Memento)模式

# 备忘录(Memento)模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。对象行为型模式

  1. 备忘录模式(Memento Pattern)在 不破坏封装性的前提下,捕获 一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
  2. 可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作

image-20231210135201856

发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

@Data
public class LeiGamer {
    // 内部状态,存档时需要存储的信息
    Integer coin;
    Integer hp;
    Integer mp;
    Integer level;


    GameServer gameServer = new GameServer();

    // 保存游戏记录
    void saveGameRecord() {
        System.out.println("保存当前游戏记录");
        //当前游戏信息 保存到备忘录
        GameRecord gameRecord = new GameRecord();
        gameRecord.setCoin(coin);
        gameRecord.setHp(hp);
        gameRecord.setMp(mp);
        gameRecord.setLevel(level);
        gameServer.add(gameRecord);

    }

    // 从备忘录获取游戏历史存档
    LeiGamer getFromMemento(Integer id) {
        System.out.println("获取历史存档信息.....");
        return gameServer.getRecord(id);
    }

    // 玩游戏
    void playGame() {
        System.out.println("coin=" + coin +
                ", hp=" + hp +
                ", mp=" + mp +
                ", level=" + level);
        System.out.println("玩游戏中....");
        int nextInt = new Random().nextInt();
        coin = hp = mp = level = nextInt;
    }

    // 退出游戏
    void exitGame() {
        System.out.println("退出并存档");
        saveGameRecord();
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

/**
 * 游戏记录 也叫备忘录信息
 */
@Data
public class GameRecord {
    Integer id;// 代表生成记录的id
    Integer coin;
    Integer hp;
    Integer mp;
    Integer level;

    // 获取当前备忘录信息
    void getCurrent() {
        System.out.println("coin=" + coin +
                ", hp=" + hp +
                ", mp=" + mp +
                ", level=" + level);
    }


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

/**
 * 游戏服务器
 * 管理者
 */
public class GameServer {
    Map<Integer, GameRecord> records = new HashMap<>();
    int i = 1;

    void add(GameRecord gameRecord) {
        gameRecord.setId(i++);
        records.put(gameRecord.id, gameRecord);
    }

    LeiGamer getRecord(Integer id) {
        GameRecord gameRecord = records.get(id);
        // 获取到备忘录里的内容 还要进行逆转才能使用
        LeiGamer leiGamer = new LeiGamer();
        leiGamer.setCoin(gameRecord.getCoin());
        leiGamer.setHp(gameRecord.getHp());
        leiGamer.setMp(gameRecord.getMp());
        leiGamer.setLevel(gameRecord.getLevel());
        return leiGamer;


    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 应用场景

什么场景用到?

  • 游戏存档
  • 数据库保存点事务(savepoint)
  • session 活化钝化

# 注意事项和细节

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节
  3. 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存,这个需要注意
  4. 适用的应用场景:
  5. 后悔药。
  6. 打游戏时的存档。
  7. Windows 里的 ctri + z。
  8. IE 中的后退。
  9. 数据库的事务管理
  10. 为了节约内存,备忘录模式可以和原型模式配合使用
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02
观察者(Observer)模式
解释器(Interpreter)模式

← 观察者(Observer)模式 解释器(Interpreter)模式→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式