设计模式:备忘录模式

2023-09-17 16:23:39


备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和恢复对象的内部状态。备忘录模式可以将对象的状态保存到备忘录对象中,并在需要时从备忘录对象中恢复状态,实现对象状态的保存和回滚。

组件

在备忘录模式中,通常包含以下角色:

  1. 发起人(Originator):负责创建备忘录对象,并将自身的状态保存到备忘录对象中。
  2. 备忘录(Memento):用于存储发起人对象的状态。备忘录可以记录发起人的状态,也可以根据需要进行状态的恢复。
  3. 管理者(Caretaker):负责保存备忘录对象,并提供对备忘录的访问。管理者可以保存多个备忘录对象,实现多个时间点的状态回滚。

代码示例

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 restoreStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}
 // 备忘录类
class Memento {
    private String state;
     public Memento(String state) {
        this.state = state;
    }
     public String getState() {
        return state;
    }
}
 // 管理者类
class Caretaker {
    private Memento memento;
     public void saveMemento(Memento memento) {
        this.memento = memento;
    }
     public Memento retrieveMemento() {
        return memento;
    }
}
 // 客户端代码
public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
         originator.setState("State 1");
        System.out.println("当前状态:" + originator.getState());
         // 保存状态
        caretaker.saveMemento(originator.saveStateToMemento());
         originator.setState("State 2");
        System.out.println("当前状态:" + originator.getState());
         // 恢复状态
        originator.restoreStateFromMemento(caretaker.retrieveMemento());
        System.out.println("恢复后的状态:" + originator.getState());
    }
}

在上述示例中,我们定义了发起人类(Originator)、备忘录类(Memento)和管理者类(Caretaker)。发起人类负责创建备忘录对象并保存状态,备忘录类用于存储状态,管理者类负责保存和提供对备忘录对象的访问。
在客户端代码中,我们创建了发起人对象和管理者对象。发起人对象设置了初始状态,并通过保存状态到备忘录对象中来保存状态。然后,我们修改发起人对象的状态,并通过从备忘录对象中恢复状态来回滚到之前的状态。
这个示例展示了如何使用Java实现备忘录模式,通过备忘录对象保存和恢复发起人对象的状态,实现对象状态的保存和回滚

源码中使用

备忘录模式在源码中有很多应用。以下是一些常见的源码中使用备忘录模式的情况:

  1. Java中的java.util.Date类:Date类提供了 getTime() 和 setTime() 方法来获取和设置日期的时间戳,可以用于保存和恢复日期对象的状态。
  2. Android开发中的Activity生命周期:在Android中,Activity的生命周期方法(如 onCreate() 、 onPause() 等)被用作保存和恢复Activity的状态,以便在系统需要时重新创建和恢复Activity。
  3. 数据库事务管理:在数据库中,事务管理器使用备忘录模式来保存数据库的状态,并在需要时回滚事务,以确保数据的一致性和完整性。
  4. 文本编辑器中的撤销/重做功能:文本编辑器中的撤销/重做功能使用备忘录模式来保存编辑操作的历史状态,以便用户可以撤销和重做操作。
    这些是备忘录模式在源码中的一些常见应用。备忘录模式通过备忘录对象来保存和恢复对象的状态,提供了一种可靠的方式来管理状态,并支持撤销和重做等操作。

优缺点

优点:

  1. 备忘录模式可以实现对象状态的备份和恢复,使得系统可以方便地回滚到之前的状态。
  2. 备忘录模式将状态保存在备忘录对象中,与原对象解耦,避免了状态暴露给其他对象,保护了对象的封装性。
  3. 备忘录模式可以灵活地扩展和修改备忘录对象,以满足不同的需求。
    缺点:
  4. 备忘录模式可能会消耗大量的内存,特别是在需要保存大量状态的情况下。
  5. 如果频繁备份和恢复对象状态,会对系统的性能产生一定的影响。
  6. 当对象的状态较多时,管理备忘录对象的成本可能会增加。

总结

备忘录模式通过备份和恢复对象状态,提供了一种可靠的方式来管理对象状态。它可以保护对象的封装性,并提供灵活的状态恢复机制。然而,备忘录模式可能会消耗较多的内存,并对系统性能产生一定的影响。在使用备忘录模式时,需要权衡其优缺点,并根据具体情况进行选择。

更多推荐

经管博士科研基础【25】概率论中的相关基础概念

1.Support在概率论中,"support"(支撑集)是指随机变量可能取值的集合。对于离散型随机变量,支撑集包含了所有可能的取值;而对于连续型随机变量,支撑集是指其密度函数或概率质量函数非零的区域。举个例子来说,对于一个离散型随机变量,比如抛硬币的结果(正面或反面),其支撑集就是{正面,反面},因为这两个是唯一可能

安装封箱机需要的条件

任何设备的安装都需要一定的场地条件,封箱机产品也不例外,对于初次使用封箱机的用户,我们会仔细提醒客户需要准备的条件,今天就把这些条件和大家分享一下,方便您今后更方便的使用封箱机产品。1、适当的场地。用户在购买封箱机之前,尤其是定制型封箱机,一定要先确定好场地尺寸以及周边无障碍物,这样封箱机的安装工作才能得以顺利进行。2

【Oracle】使用 SQL Developer 连接 Oracle 数据库

文章目录前言一、准备工作1、安装SQLDeveloper2、安装Oracle数据库二、连接Oracle数据库1、打开SQLDeveloper2、连接数据库3、访问数据库三、SQL开发功能1、SQLWorksheet2、对象浏览器3、数据库管理四、总结前言SQLDeveloper是Oracle官方推出的一款免费的数据库开

ARM64 SMP多核启动详解2(psci)

1.支持psci情况上面说了pin-table的多核启动方式,看似很繁琐,实际上并不复杂,无外乎主处理器唤醒从处理器到指定地址上去执行指令,说他简单是相对于功能来说的,因为他只是实现了从处理器的启动,仅此而已,所以,现在社区几乎很少使用spin-table这种方式,取而代之的是psci,他不仅可以启动从处理器,还可以关

AJAX学习

文章目录创建XMLHttpRequest对象向服务器发送请求XMLHttpRequest.open()XMLHttpRequest.send()GET或POST服务器响应XMLHttpRequest的属性XMLHttpRequest.readyStateXMLHttpRequest.onreadystatechange

Linux 下 Mysql 的安装与卸载

文章目录Mysql安装安装服务安装客户端设置远程连接进入mysql使用mysql库查看用户表更新用户表强制刷新权限重启mysql服务其他设置mysql的字符编码找到[mysqld_safe],在底下添加红色标记的字符添加server编码在底下添加红色标记的字符找到[mysql]在底下添加红色标记的字符重启服务即可Mys

五、回溯(trackback)

文章目录一、算法定义二、经典例题(一)排列1.[46.全排列](https://leetcode.cn/problems/permutations/description/)(1)思路(2)代码(3)复杂度分析2.[LCR083.全排列](https://leetcode.cn/problems/VvJkup/desc

7.2.4 【MySQL】匹配范围值

回头看我们idx_name_birthday_phone_number索引的B+树示意图,所有记录都是按照索引列的值从小到大的顺序排好序的,所以这极大的方便我们查找索引列的值在某个范围内的记录。比方说下边这个查询语句:SELECT*FROMperson_infoWHEREname>'Asa'ANDname<'Barlo

科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?

科技云报道原创。近年来,在云计算和网络安全产业的蓬勃发展下,我国云安全行业市场规模呈现高速增长态势,在网络安全市场总体规模中占比不断上升。据统计,近5年我国云安全市场保持高速增长,2021年我国云安全市场规模达到了117.7亿元,2022年行业整体规模达到173.3亿元,2023年市场规模将达到330亿元人民币,由此可

服务网格和性能优化:介绍如何通过服务网格提高微服务架构的性能和可扩展性

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Vue-cli搭建SPA项目

前言VueCLI(VueCommandLineInterface)是一个用于快速搭建基于Vue.js的前端项目的工具。它是Vue.js官方提供的一个脚手架工具,旨在简化Vue.js项目的开发过程。VueCLI提供了一些强大的功能,帮助开发者轻松创建、开发和构建Vue.js应用程序VueCLI的主要特点和功能:快速创建项

热文推荐