【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解

本文主要是介绍【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

👈️上一篇:观察者模式

设计模式-专栏👈️

---

文章目录

  • 备忘录模式
  • 定义
    • 英文原话
    • 直译
    • 如何理解呢?
  • 3个角色
    • 1. Memento(备忘录)
    • 2. Originator(原发器)
    • 3. Caretaker(负责人)
    • 类图
    • 代码示例
  • 备忘录模式的应用
    • 备忘录模式的优点
    • 备忘录模式的缺点
    • 备忘录模式的使用场景

备忘录模式

备忘录模式(Memento Pattern)又称为快照(Snapshot)模式或Token模式。

备忘录模式就像我们在生活中使用的“后悔药”。有时候,我们可能会做出一些决定或操作,但事后可能会后悔,希望回到之前的状态。备忘录模式就是这样一种“后悔药”,它能够帮助我们在需要的时候,返回到之前的状态。比如,在写文档时,如果我们不小心删除了一个重要的段落,使用备忘录模式,我们就可以轻松地恢复到删除之前的状态。但是,这种“后悔药”也有副作用,那就是它可能会占用一些资源,就像我们需要空间来保存这些后悔的机会一样。

定义

英文原话

Without violating encapsulation,capture and externalizean object’s internal state so that the object can be restored to this state later.

直译

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

如何理解呢?

有时有必要记录一个对象的内部状态。

为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到他们先前的状态。

但是对象通常封装了其部分或所有的状态信息,使得其状态不能被其他对象访问,也就不可能在该对象之外保存其状态。

而暴露其内部状态又将违反封装的原则,可能有损应用的可靠性和可扩展性。

我们可以用备忘录(Memento)模式解决这一问题。

一个备忘录(memento)是一个对象,他存储另一个对象(原发器originator)在某个瞬间的内部状态,而后者称为备忘录的原发器originator)。

当需要设置原发器的检查点时,备份机制向原发器请求一个备忘录。

原发器用描述当前状态的信息初始化备忘录

只有原发器(originator)可以向备忘录中存取信息,备忘录对其他的对象不可见。

适用于必须保存一个对象在某一时刻的(部分)状态(以便以后有需要可以恢复回此状态)且如果用接口让其他对象直接得到这些状态,将会暴露对象实现细节并破坏对象的封装性。在这样的场景下使用备忘录(Memento)模式。

3个角色

1. Memento(备忘录)

负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。

备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象;而Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。

2. Originator(原发器)

originator创建一个备忘录,用以记录当前时刻它的内部状态。

使用备忘录回复内部状态。

只有创建备忘录的原发器会对他的状态状态进行赋值和检索。

3. Caretaker(负责人)

负责保存好备忘录。

不能对备忘录的内容进行操作或检查。

负责保存与提供备忘录对象,但是不能对备忘录的内容进行访问或者操作。

类图

在这里插入图片描述

代码示例

package com.polaris.designpattern.list3.behavioral.pattern08.memento.classicdemo;// 备忘录接口
interface Memento {// 可能包含一些用于获取状态的方法  String getState();
}// 发起人(Originator)  
class Originator {private String state;// 创建一个备忘录并保存当前状态  public Memento createMemento() {return new MementoImpl(state);}// 恢复发起人状态  public void restoreMemento(Memento memento) {this.state = ((MementoImpl) memento).getState();}// 设置发起人状态  public void setState(String state) {this.state = state;}// 获取发起人状态  public String getState() {return state;}// 备忘录实现类,仅供发起人使用  private static class MementoImpl implements Memento {private String state;public MementoImpl(String state) {this.state = state;}public String getState() {return state;}}
}// 管理者(Caretaker)  
class Caretaker {private Memento memento;// 保存备忘录  public void setMemento(Memento memento) {this.memento = memento;}// 获取备忘录  public Memento getMemento() {return memento;}
}// 使用示例  
public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State #1");System.out.println("Current State: " + originator.getState());// 保存当前状态  caretaker.setMemento(originator.createMemento());originator.setState("State #2");System.out.println("Current State: " + originator.getState());// 恢复之前的状态  originator.restoreMemento(caretaker.getMemento());System.out.println("Restored State: " + originator.getState());}
}/* Output:
Current State: State #1
Current State: State #2
Restored State: State #1
*///~

在这个例子中,Originator类维护了一个内部状态state,并提供了创建备忘录(createMemento)和恢复状态(restoreMemento)的方法。备忘录的实际实现是MementoImpl类,但它被声明为Originator的私有内部类,因此外部类(如Caretaker)不能直接访问它。Caretaker类负责管理备忘录对象。在MemontoPatternDemo类中,我们展示了如何使用这些类来保存和恢复Originator的状态。

备忘录模式的应用

备忘录模式,又称之为快照模式(Snapshot Pattern),是一种软件设计模式,主要用于保存和恢复对象的内部状态。以下是其主要应用:

  1. 撤销和恢复功能:在Word、PhotoShop等软件中,用户可以撤销之前的操作,或恢复到某个历史状态。备忘录模式能够记录用户的每一步操作,从而实现这一功能。
  2. 电子书的阅读进度:用户在阅读电子书时,可以随时保存阅读进度,下次打开时可以从上次的阅读进度继续阅读。
  3. 软件开发中的版本控制:记录每个版本的代码快照,方便进行版本控制和回溯。
  4. 事务管理:在数据库事务处理中,如果一系列操作不能全部完成,就需要回滚操作,将数据恢复到操作之前的状态。备忘录模式可以记录一系列操作的快照,当需要回滚时,可以恢复到备忘录状态。

备忘录模式的优点

  1. 提供恢复机制:为用户提供一种可以恢复状态的机制,允许在必要时将对象恢复到之前的状态。
  2. 实现内部状态的封装:除了创建它的发起人之外,其他对象都不能够访问这些状态信息,这有助于保持封装的边界。
  3. 简化发起人类:发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

备忘录模式的缺点

  1. 资源消耗大:如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
  2. 难以预测存储需求:当负责人角色将一个备忘录存储起来的时候,可能无法预测这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。

备忘录模式的使用场景

备忘录模式适用于需要保存/恢复数据的相关业务场景,如:

  1. 撤销操作:在文本编辑器、图形编辑器等工具中,用户可能需要撤销之前的操作。
  2. 游戏存档:在游戏中,玩家可能需要存档以便在之后恢复游戏进度。
  3. 数据库事务管理:在数据库事务处理中,如果一系列操作不能全部完成,就需要回滚操作,将数据恢复到操作之前的状态。

---

👈️上一篇:观察者模式

设计模式-专栏👈️

这篇关于【设计模式深度剖析】【8】【行为型】【备忘录模式】| 以后悔药为例加深理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062798

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR