设计模式(14)备忘录模式

news2024/11/15 20:01:49

一、介绍:

1、定义:是一种行为设计模式,它允许将对象的内部状态保存在一个备忘录对象中,并在需要时恢复对象的状态,而不破坏对象的封装性。

2、使用场景:

(1)当需要保存和恢复对象的内部状态,并且希望封装状态的具体实现细节。备忘录模式将对象的状态保存在备忘录对象中,对外部对象隐藏了状态的实现细节,提高了对象的封装性。

(2)当需要在不破坏对象封装性的前提下保存和恢复对象的状态,以便进行撤销、回滚或者历史记录管理时。备忘录模式可以保存对象的历史状态,并在需要时恢复到指定的状态。

(3)当需要保存对象状态的快照,以便在将来某个时间点恢复到该状态时。备忘录模式可以捕获对象的当前状态并保存在备忘录对象中,以供后续恢复使用。

(4)当对象的状态变化频繁,但是希望能够随时回滚到之前的某个状态时。备忘录模式可以在每次状态变化时保存备忘录,以便在需要时进行状态的回滚。

(5)当需要实现多级撤销操作或者复杂的历史记录功能时。备忘录模式可以保存多个备忘录对象,实现多级撤销或者浏览历史记录的功能。

3、缺点:使用备忘录模式时需要考虑内存的使用情况和性能要求。

4、组成:备忘录模式的核心是备忘录(Memento)角色,它用于存储对象的内部状态,并提供对状态的访问方法。原发器(Originator)角色负责创建备忘录并将自身的状态保存到备忘录中。管理者(Caretaker)角色负责存储和恢复备忘录,但是它不能访问备忘录的内部状态。

(1)备忘录类 Memento,用于存储对象的状态:

public class Memento {
    private String state;
    
    public Memento(String state) {
        this.state = state;
    }
    
    public String getState() {
        return state;
    }
}

(2)原发器类 Originator,它包含了需要保存和恢复的状态,并提供了创建备忘录和从备忘录恢复状态的方法:

public class Originator {
    private String state;
    
    public void setState(String state) {
        this.state = state;
    }
    
    public String getState() {
        return state;
    }
    
    public Memento createMemento() {
        return new Memento(state);
    }
    
    public void restoreFromMemento(Memento memento) {
        state = memento.getState();
    }
}

(3)管理者类 Caretaker,它负责存储和恢复备忘录对象:

public class Caretaker {
    private Memento memento;
    
    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    
    public Memento getMemento() {
        return memento;
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        
        // 设置原发器的状态
        originator.setState("State 1");
        System.out.println("Initial state: " + originator.getState());
        
        // 创建备忘录并保存到管理者
        caretaker.setMemento(originator.createMemento());
        
        // 修改原发器的状态
        originator.setState("State 2");
        System.out.println("Updated state: " + originator.getState());
        
        // 从备忘录中恢复原发器的状态
        originator.restoreFromMemento(caretaker.getMemento());
        System.out.println("Restored state: " + originator.getState());
    }
}

二、demo:

1、文本编辑器撤销恢复功能:

(1)备忘录:

public class EditorMemento {
    private String content;
    
    public EditorMemento(String content) {
        this.content = content;
    }
    
    public String getContent() {
        return content;
    }
}

(2)原触发器:

public class Editor {
    private String content;
    
    public void setContent(String content) {
        this.content = content;
    }
    
    public String getContent() {
        return content;
    }
    
    public EditorMemento createMemento() {
        return new EditorMemento(content);
    }
    
    public void restoreFromMemento(EditorMemento memento) {
        content = memento.getContent();
    }
}

(3)管理者类:

import java.util.Stack;
 
public class History {
    private Stack<EditorMemento> mementos;
    
    public History() {
        mementos = new Stack<>();
    }
    
    public void pushMemento(EditorMemento memento) {
        mementos.push(memento);
    }
    
    public EditorMemento popMemento() {
        return mementos.pop();
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Editor editor = new Editor();
        History history = new History();
        
        // 用户输入和编辑文本
        editor.setContent("First version");
        System.out.println("Current content: " + editor.getContent());
        
        // 创建备忘录并保存到历史记录
        history.pushMemento(editor.createMemento());
        
        // 用户继续编辑文本
        editor.setContent("Second version");
        System.out.println("Current content: " + editor.getContent());
        
        // 用户撤销操作,恢复到之前的状态
        EditorMemento memento = history.popMemento();
        editor.restoreFromMemento(memento);
        System.out.println("Restored content: " + editor.getContent());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xcheck插件安装到idea中

一、安装xcheck-cli 1.部署好xbox环境之后&#xff0c;在 xcheck 页面右上角&#xff0c;点击帮助进入帮助中心&#xff0c;切换至资源下载tab&#xff0c;进入资源下载页面&#xff0c;下载好所需要的版本&#xff0c;我需要的是windows版本的xcheck-cli和xcheck-idea插件 2.添…

基于ssm卤菜销售系统

基于ssm卤菜销售系统 摘要 基于SSM&#xff08;Spring、SpringMVC、MyBatis&#xff09;框架的卤菜销售系统是一种现代化的食品销售管理系统&#xff0c;旨在提高卤菜店铺的效率、准确性和客户满意度。该系统通过整合多个关键组件&#xff0c;实现了卤菜销售业务的自动化管理&a…

【完美云曦篇】新预告,云曦遭魔改被抓,石昊首秀九天劫光,反杀战王

【侵权联系删除】【文/郑尔巴金】 随着石昊进入血色平原&#xff0c;与云曦开启大逃亡&#xff0c;万众期待的完美世界动画战王之殇的全新特别篇终于要来了。官方也是相当的给力&#xff0c;直接公布了特别篇第135集的先行预告&#xff0c;石昊的雷帝新形态直接帅翻了&#xf…

使用VisualStudio生成类图结构图for高效阅读代码

使用VisualStudio高效阅读代码 前言相关准备导入工程利用VisualStudio生成类图&#xff0c;结构体调用关系利用EnterpriseArchitect(EA)画时序图 前言 目前市面上代码阅读的IDE工具非常丰富&#xff0c;也各有千秋。由于工作经历原因&#xff0c;研发机经历过windows、Mac、Li…

vscode远程连接ubuntu

修改环境变量&#xff0c;改使用git自带的ssh工具 openssh: C:\Windows\System32\OpenSSH\ssh.exeGit ssh: C:\Program Files\Git\usr\bin\ssh.exe vscode安装插件remote-ssh 重开软件&#xff0c;在左侧拓展入口下方&#xff0c;进入远程资源管理器 点击设置&#xff0c;进…

在vs2019或者vs2022中写linux C/CPP程序或者QT程序总是乱码怎么办?

第一步 第二步 第三步 成果 1)情况1 或者: 2)情况2 (好像vs2022是情况1 , vs2019是情况2) 然后这样保存就好:

SYS/BIOS 开发教程: 创建自定义平台

目录 SYS/BIOS 开发教程: 创建自定义平台创建自定义平台新建工程并指定自定义平台修改现有工程使用自定义平台 参考: TI SYS/BIOS v6.35 Real-time Operating System User’s Guide 6.2节 本示例基于 EVMC6678L 开发板, 创建自定义平台, 并将代码段的位置指定到C6678器件内部的…

Chromium源码由浅入深(一)

工作中需要对Chromium源码、尤其是源码中图形部分进行深入研究&#xff0c;所以借此机会边学习边写文章&#xff0c;分享一下我的实时学习研究Chromium源码的由浅入深的过程。 闲言少叙&#xff0c;书归正传。 通过命令行启动Chrome浏览器&#xff0c;命令及结果如下&#xf…

docker 部署tig监控服务

前言 tig对应的服务是influxdb grafana telegraf 此架构比传统的promethus架构更为简洁&#xff0c;虽然influxdb开源方案没有集群部署&#xff0c;但是对于中小型服务监控需求该方案简单高效 本文以docker-compose来演示这套监控体系的快速搭建和效果。 部署 docker-compos…

vue手动拖入和导入excel模版

1.列表按钮 系统设置的按钮权限 v-if“$hasPermission(‘om:equipmentinformation:importProblemStatistics’)” <el-button click“importExcel(scope.row.id)” size“small” type“text” v-if“$hasPermission(‘om:equipmentinformation:importProblemStatistics’)…

【lesson14】进程控制之进程等待

文章目录 为什么要有进程等待&#xff1f;如何等待和什么是等待&#xff1f; 为什么要有进程等待&#xff1f; 1.子进程退出&#xff0c;父进程不管子进程&#xff0c;子进程就要处于僵尸状态------会导致内存泄漏 2.父进程创建子进程是要让子进程办事的&#xff0c;那么子进…

AI小百科 - 什么是词向量?

如何表示一个单词的意义&#xff1f;对人来说&#xff0c;一般用解释法&#xff0c;用一段话来解释词的含义。如“太阳”在新华字典中的释义是“太阳系的中心天体。银河系的一颗普通恒星。”然而&#xff0c;这样的解释计算机是听不懂的&#xff0c;必须用更简洁的方式来对词义…

图片放大缩小时,图片上会出现蓝色蒙版解决方案

1. 问题描述&#xff1a; 页面上需要展示几张图片&#xff0c;并且有放大、缩小、旋转功能&#xff0c;在放大时&#xff0c;图片上出现了蓝色蒙版&#xff0c;如下图&#xff1a; 2. 解决方案&#xff1a; body{ -webkit-user-select:none; -moz-user-select:none; -ms-user…

等电位连接器行业应用综合方案

等电位连接器的原理 等电位连接器的原理是利用气体放电管或压敏电阻等非线性元件&#xff0c;当连接器两端的电位差大于所限峰值电压时&#xff0c;连接器导通&#xff0c;迫使连接器两端不同接地体电位基本相等&#xff0c;消除接地体间放电现象&#xff0c;从而避免了由于地…

p11 第60题 设计一个算法,逆序单链表中的数据 电子科技大学2014年数据结构(c语言代码实现)

通过头插法可以实现单链表的逆置 下方博客有图解&#xff1a; 王道p40 5.将带头结点的单链表就地逆置&#xff0c;所谓“就地”是指辅助空间复杂度为O&#xff08;1&#xff09;-CSDN博客 单链表的逆置可以通过遍历链表&#xff0c;逐个将节点取出并插入到新链表的头部来实现…

第31届中国国际测量控制与仪器仪表展览会隆重举行,汉威科技创新产品精彩亮相

10月23日~25日&#xff0c;由中国仪器仪表学会主办的第31届中国国际测量控制与仪器仪表展览会&#xff08;原“多国仪器仪表展”&#xff09;于北京国家会议中心隆重举行。 本届展会吸引了全球400多家行业企业、高校及科研院所参展&#xff0c;同期还举办了主论坛及多场分论坛活…

GB28181学习(十三)——订阅与通知

事件订阅 要求 事件订阅应使用SUBSCRIBE方法&#xff1b;事件源接收事件订阅时&#xff0c;事件源应向事件观察者发送确认消息&#xff1b;事件源&#xff1a; 联网系统SIP服务器报警设备移动设备被集成的卡口系统等 事件观察者 联网系统SIP服务器客户端 事件&#xff1a; 报…

学习笔记-极大似然法与最小二乘法

1、极大似然法&#xff08; maximum likelihood estimation&#xff0c;MLE &#xff09; 极大似然法&#xff08; maximum likelihood estimation&#xff0c;MLE &#xff09;是概率统计中估算模型参数的一种很经典和重要的方法。 &#xff08;1&#xff09;定义 最大似然估…

ArcGIS中批量mxd高版本转低版本

我们经常在给别人发ArcGIS的工程文件mxd&#xff0c;结果到别人那发现mxd工程文件打不开&#xff0c;原因是我们的arcgis版本高于别人&#xff0c;此时工程文件又很多&#xff0c;一个个转存成低版本又嫌麻烦&#xff0c;于是我们做了个批量mxd高版本转低版本的小工具&#xff…

2023平台工程崭露头角,AI 带来新机遇与挑战

在今年&#xff0c;平台工程正在迅速在 IT 企业中崭露头角&#xff0c;成为软件开发团队的必要实践。根据 CloudBees 发布的最新报告《2023年平台工程&#xff1a;快速采纳和影响》&#xff0c;83%的受访者已经完全实施了平台工程&#xff0c;或正处于某种实施阶段。 平台工…