java设计模式学习之【备忘录模式】

文章目录

引言

想象一下,你正在编辑一篇重要的文档,突然你意识到最近的一些更改实际上破坏了文档的结构。幸运的是,你的文本编辑器允许你撤销最近的操作,回到之前的状态。这种能力就像有一个时间机器,可以回到过去,撤销错误的决策。在软件开发中,我们经常需要这种"撤销"功能,备忘录模式为此提供了一种优雅的解决方案。

备忘录模式简介

定义与用途

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许保存一个对象的某个状态,以便在未来某个时刻恢复。这个模式在用户需要撤销或恢复操作时特别有用,它通过引入备忘录对象来捕获和存储对象的内部状态,而不破坏其封装性。

实现方式

实现备忘录模式通常涉及以下几个关键组件:

  • 原发器(Originator):需要保存状态以便后续恢复的对象。
  • 备忘录(Memento):存储原发器对象的内部状态。
  • 看护者(Caretaker):负责保存备忘录,但不修改或检查其内容。

使用场景

备忘录模式适用于以下场景:

  • 当需要保存和恢复对象的历史状态时。
  • 当直接获取对象的状态会暴露其实现细节并破坏对象封装性时。

例如:

  1. 文本编辑器的撤销功能:用户可以撤销最近的编辑操作,并恢复到之前的文本状态。
  2. 游戏保存和加载:在游戏中保存当前进度,玩家可以在以后加载保存点继续游戏。
  3. 软件的快照功能:软件可以定期保存当前状态,以便在出现问题时恢复到工作状态

优势与劣势

  • 优势
    1. 提供了一种恢复状态的灵活方式,而无需暴露对象的内部结构。
    2. 可以简化原发器的职责,因为状态的保存和恢复由备忘录承担。
  • 劣势
    1. 如果用户不断创建备忘录,可能会占用大量内存。
    2. 管理备忘录的成本可能会很高,尤其是如果需要支持多次撤销时。

在Spring框架中的应用

在Spring框架中,虽然备忘录模式不像其他设计模式那样直接显现,但它的核心概念------即保存和恢复对象状态------在某些功能中得到了体现。以下是Spring框架中体现备忘录模式概念的一些方面:

1. Spring Web Flow
在Spring Web Flow中,备忘录模式的概念被用于管理Web应用中的页面流。在用户导航过程中,每个页面的状态都可以被保存,用户可以回退到之前的状态。这类似于备忘录模式中的保存和恢复状态的概念。

2. 事务管理
Spring的声明式事务管理允许你在开始一个事务时保存数据库的某种状态,并在事务完成时恢复这种状态。如果事务失败,Spring可以回滚到事务开始之前的状态,这与备忘录模式中保存对象状态以便恢复的概念相符。

3. Spring Security的认证和授权
在Spring Security中,用户的认证状态(如安全上下文)在用户会话中保存和恢复。虽然这不是传统意义上的备忘录模式,但它体现了备忘录模式的核心概念------保存和恢复对象的状态。

4. 配置和恢复Bean状态
Spring的BeanFactory和ApplicationContext容器允许定义、保存和恢复Bean的配置状态。这些状态信息(如Bean的属性和依赖关系)可以在容器启动时被加载,并在需要时恢复,这与备忘录模式的基本原理类似。

尽管这些应用可能不是备忘录模式的典型示例,但它们都采用了该模式的核心思想------即保存和恢复状态。这些机制在Spring框架中至关重要,有助于实现高效和可靠的状态管理。

备忘录示例


步骤 1:创建备忘录类

java 复制代码
public class Memento {
   private String state;

   public Memento(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }    
}

Memento 类包含了对象的状态。它有一个方法 getState() 用于获取保存的状态。

步骤 2:创建原发器类

java 复制代码
public class Originator {
   private String state;

   public void setState(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }

   public Memento saveStateToMemento(){
      return new Memento(state);
   }

   public void getStateFromMemento(Memento memento){
      state = memento.getState();
   }
}

Originator 类是要保存状态的对象。它创建备忘录来保存自己的状态,并从备忘录中恢复状态。

步骤 3:创建看护者类

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();

   public void add(Memento state){
      mementoList.add(state);
   }

   public Memento get(int index){
      return mementoList.get(index);
   }
}

CareTaker 类负责保存备忘录,并在需要时提供备忘录。它维护了一个备忘录列表。

步骤 4:使用看护者和原发器对象

java 复制代码
public class MementoPatternDemo {
   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("当前状态: " + originator.getState());        
      
      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("第一次保存的状态: " + originator.getState());
      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("第二次保存的状态: " + originator.getState());
   }
}

在这个演示类中,我们创建了一个原发器对象 originator 和一个看护者对象 careTaker。原发器对象更改其状态几次,并保存这些状态到备忘录。通过看护者对象,我们能够恢复原发器对象之前的状态。

这个示例演示了备忘录模式如何用于保存和恢复对象的状态,同时不暴露对象的内部结构。通过这种方式,可以实现如撤销功能这样的操作,而不影响对象的封装性

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址

https://github.com/RuofeiSun/lf-23Pattern

相关推荐
Aileen_0v07 分钟前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
桂月二二2 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
liuxin334455662 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
ke_wu2 小时前
结构型设计模式
开发语言·设计模式·组合模式·简单工厂模式·工厂方法模式·抽象工厂模式·装饰器模式
小马爱打代码2 小时前
设计模式详解(建造者模式)
java·设计模式·建造者模式
小王爱吃月亮糖3 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
栗子~~3 小时前
idea 8年使用整理
java·ide·intellij-idea
2301_801483693 小时前
Maven核心概念
java·maven
_im.m.z3 小时前
【设计模式学习笔记】1. 设计模式概述
笔记·学习·设计模式
Q_19284999063 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端