Java设计模式学习记录-备忘录模式

简介: 前言这次要介绍的是备忘录模式,也是行为模式的一种 。现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了。那么备忘录模式又是什么样子的呢?是不是和手机上的备忘录一样呢?下面来介绍一下。

前言

这次要介绍的是备忘录模式,也是行为模式的一种 。现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了。那么备忘录模式又是什么样子的呢?是不是和手机上的备忘录一样呢?下面来介绍一下。

备忘录模式

概念介绍

备忘录模式是指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。简单的来说就是平时玩的通关游戏,第一次前进了5步,第二次前进时踩到便便了,然后要回到之前的进度。例如下图结构:

https://img4.mukewang.com/5b94dcbc00017d7f09000866.jpg

举例

我们还是用一个小例子来简单介绍一下备忘录模式,在玩一个步骤游戏时,每走一步时步数都加一,遇到道具可以快速走几步,或者减几步。用备忘录模式的思想来实现这个逻辑,就是如下代码。

游戏类

 /**
  * 游戏 */@Datapublic class Game {
  /**      * 玩家走的步数     */
  private int playerStep;
  /**
   * 备份游戏
   * @return
   */
  public GameMemento createGameMemento(){
  return new GameMemento(playerStep);
  }
  
  /**
   * 开始玩游戏     */
  public void play(){
  playerStep = 0;
  }
  /**
   * 恢复备份
   * @param gameMemento     */
  public void restore(GameMemento gameMemento){
      this.playerStep = gameMemento.getPlayerSteps();
       }}

备份

 /**
  * 备份 */@Getterpublic class GameMemento {
 /** 步数 */
  private int playerSteps;
 /**
  * 备份步数
  * @param playerSteps
  */     public GameMemento(int playerSteps){
     this.playerSteps = playerSteps;
   }}

备份信息管理类

/**
  * 备份信息管理类 */public class Caretaker {
    /** 备份 */
     private GameMemento gameMemento;
    /** 恢复备份 */
     public GameMemento retrieveMemento(){
    return this.gameMemento;
    }
    /** 保存备份 */
     public void saveMemento(GameMemento gameMemento){
       this.gameMemento = gameMemento;
    }}

测试

public class Player {
     public static void main(String[] args) {
        Game game = new Game();
        System.out.println("游戏开始,捡到滑板,前进10步");
        game.setPlayerStep(10);
        //备份当前状态
        System.out.println("备份当前状态");
        GameMemento gameMemento = game.createGameMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemento(gameMemento);
        System.out.println("备份完成");
        game.play();
        System.out.println("踩到便便了,当前步数为:"+game.getPlayerStep());
        System.out.println("还原到之前一步");         
        game.restore(caretaker.retrieveMemento());         
        System.out.println("恢复完成,当前玩家步数是:"+game.getPlayerStep());
   }}

运行结果

游戏开始,捡到滑板,前进10步备份当前状态备份完成踩到便便了,当前步数为:0还原到之前一步恢复完成,当前玩家步数是:10

上面的这个例子使用了lombok插件的注解例如:@Getterhe@Data所以少写了getter和setter方法。看完了这个小例子,大概应该知道备忘录模式是个什么逻辑了吧,有点类似咱们平时知道的事务回滚的机制。下面还是分析一下,备忘录模式都是由哪些部分组成的。

备忘录模式结构

结构图如下

https://img1.mukewang.com/5b94dcc40001c69513460594.jpg

备忘录模式的构成角色如下所示。

原发器类(Originator):创建一个备忘录对象,使用备忘录存储它的内部状态。

负责人类(CareTaker):负责保存好备忘录对象,不能检查或操作备忘录的内容。

备忘录类(Memento):将原发器的内部状态存储起来,原发器根据需要决定备忘录存储原发器的哪些内部状态。

总结

优点

1、它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。

2、备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。

缺点

资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。

适用场景

1、保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时它能够恢复到先前的状态,实现撤销操作。

2、防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。



目录
相关文章
|
7月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
988 157
|
7月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
819 2
|
7月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
412 1
|
8月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
228 1
|
7月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
656 0
|
7月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2060 35
|
7月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
590 8
|
7月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
760 8
|
8月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
132 5
|
8月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
213 5