备忘录模式

news2024/10/7 13:21:14

一、备忘录模式

1、定义

备忘录模式(Memento Pattern)又称作快照模式(Snapshot Pattern),指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为型设计模式。

状态模式的本质是从发起人实体类(Originator)隔离存储功能,降低实体类的职责。

2、结构

(1)模式的结构

主要角色如下:

  • 发起人角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,具备状态回滚功能。
  • 备忘录角色(Memento):用于存储 Originator的内部状态,且可以防止 Originator以外的对象进行访问。
  • 备忘录管理员角色(Caretaker):负责存储、提供管理 Memento,无法对 Memento的内部进行操作个访问。

3、优缺点

优点:

  • 简化发起人实体类(Originator)的职责,隔离状态存储与获取,实现了信心的封装,客户端无须关心状态的保存细节。
  • 提供状态的回滚功能。

缺点:

  • 消耗资源:如果需要保存的状态过多,则每一次保存都会消耗很多内存。

4、使用场景

  • 需要保存历史快照的场景。
  • 希望在对象之外保存状态,且除了自己,其他类 对象无法访问状态保存的具体内容。

二、模式的通用实现

代码如下:

public class MementoPattern {

    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setState("init do something");

        //保存备忘录
        IMemento memento = originator.createMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.storeMemento(memento);
        System.out.println("--------第一次保存,状态如下:---------");
        System.out.println(originator.getState());

        //回滚
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("-------回滚之后---------");
    }
}


//发起人角色
class Originator{
    //内部状态
    private String state;

    public String getState() {
        return state;
    }

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

    public IMemento createMemento(){
        return new Memento(this.state);
    }

    public void restoreMemento(IMemento memento){
        this.state = ((Memento) memento).state;
    }

    static class Memento implements IMemento{
        private String state;

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

        public String getState() {
            return state;
        }

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

// 备忘录角色
interface IMemento{

}

//备忘录管理员角色
class Caretaker{
    private IMemento memento;

    public IMemento getMemento() {
        return memento;
    }

    public void storeMemento(IMemento memento){
        this.memento = memento;
    }
}

三、模式的应用实例

以草稿箱为例。

(1)编辑器 - 发起人角色

@Data
@AllArgsConstructor
@ToString
public class Editor {
    private String title;

    private String content;

    public ArticleMemento saveToMemento(){
        ArticleMemento articleMemento = new ArticleMemento(this.title, this.content);
        return articleMemento;
    }

    public void undoFromMemento(ArticleMemento articleMemento){
        this.title = articleMemento.getTitle();
        this.content = articleMemento.getContent();
    }

}

(2)文章-备忘录角色

@AllArgsConstructor
@ToString
@Getter
public class ArticleMemento {
    private String title;

    private String content;
    
}

(3)草稿箱 - 备忘录管理员角色

public class DraftsBox {
	// 存储 - 后进先出
	private final Stack<ArticleMemento> STACK = new Stack<>();

	public ArticleMemento getMemento() {
		ArticleMemento articleMemento = STACK.pop();
		return articleMemento;
	}

	public void addMemento(ArticleMemento articleMemento) {
		STACK.push(articleMemento);
	}
}

(4)测试

	public static void main(String[] args) {
		DraftsBox draftsBox = new DraftsBox();

		Editor editor = new Editor("init title", "首次发表");
		ArticleMemento articleMemento = editor.saveToMemento();
		draftsBox.addMemento(articleMemento);
		System.out.println("--------第一次编辑,保存草稿之后,信息如下:---------");
		System.out.println(editor);

		editor.setTitle("one update");
		editor.setContent("第一次修改");
		ArticleMemento articleMemento1 = editor.saveToMemento();
		draftsBox.addMemento(articleMemento1);
		System.out.println("--------第一次修改,保存草稿之后,信息如下:---------");
		System.out.println(editor);

		editor.setTitle("two update");
		editor.setContent("第二次修改");
		//ArticleMemento articleMemento2 = editor.saveToMemento();
		//draftsBox.addMemento(articleMemento2);
		System.out.println("--------第一次修改,还没保存草稿,信息如下:---------");
		System.out.println(editor);

		System.out.println("-------撤销操作---------");

		ArticleMemento memento = draftsBox.getMemento();
		editor.undoFromMemento(memento);
		System.out.println("--------第一次撤销,之后,信息如下:---------");
		System.out.println(editor);

		ArticleMemento memento2 = draftsBox.getMemento();
		editor.undoFromMemento(memento2);
		System.out.println("--------第二次撤销,之后,信息如下:---------");
		System.out.println(editor);

	}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

你好,Cartesi Rollups Alpha 0.8.0

支持 Arbitrum 和 Optimism 部署&#xff0c;并使内部增强。我们通过这个新版本支持在Optimism和Arbitrum L2 链上的部署&#xff0c;为 Cartesi Rollups DApp 开发人员带来了更低的延迟和更低的gas费用。我们致力于提高 Cartesi 技术的多样性和性能提升&#xff0c;并且通过 R…

【MySQL】视图

文章目录视图基本使用视图规则与限制视图 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据,视图的数据变化会影响到基表,基表的数据变化也会影响到视图, 主要作用是,将表的内容,常用需要的部分创建一个部分,这样使用视图的时候,可以减…

CAS:1407166-70-4,NODA-GA-NHS ester大环化合物供应

基本信息 名称&#xff1a; NODA-GA-NHS ester 2,2′-(7-(1-carboxy-4-((2,5-dioxopyrrolidin-1-yl)oxy)-4-oxobutyl)-1,4,7-triazonane-1,4-diyl)diacetic acid CAS编号&#xff1a;1407166-70-4 分子式&#xff1a;C19H28N4O10&#xff0c;HPF6&#xff0c;TFA 分子量&a…

HTTP MIME类型

文章目录HTTP MIME类型HTTP MIME类型 HTTP 请求头中的 Accept 头是客户端用来告诉服务器&#xff0c;客户端可以处理什么类型的内容&#xff0c;这种内容类型使用 MIME 类型来表示。借助内容协商机制&#xff0c;服务器可以从诸多 MIME 中选择一项进行应用&#xff0c;并使用 …

Java精品项目源码第145期食品检测管理系统

Java精品项目源码第145期食品检测管理系统 大家好&#xff0c;小辰哥又来啦&#xff0c;今天给大家介绍一个错的基于SSM的食品检测管理系统。 文章目录Java精品项目源码第145期食品检测管理系统前言一、项目运行1.运行环境2.截图前言 提示&#xff1a;以下是本篇文章正文内容…

大数据-玩转数据-Linux部署redis集群

一、下载安装包 访问https://redis.io/download 到官网进行下载。这里下载最新版本. 或直接下载 wget http://download.redis.io/releases/redis-6.2.7.tar.gz 二、安装环境 redis是C语言开发&#xff0c;安装redis需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环…

数据结构——线性表

线性表的基本操作 对于不同的应用&#xff0c;线性表的基本操作是不同的&#xff0c;上诉操作是最基本的&#xff0c;对于实际问题中涉及的关于线性表的更复杂操作&#xff0c;完全可以用这些基本操作的组合来实现。如要使得A A U B,就是要将存在于集合B中但不存在于集合A中的…

Java项目:SSM实现茶叶电商销售商城

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角…

软件设计与体系结构——结构型模式

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 结构型模式(Structural Pattern)描述如何将类或对象按某种布局组成更大的结构。就像搭积木&#xff0c;可以通过简单积木的组合形成复杂的、功能更为强大的结构 结构型模式可以分为类结构型…

(附源码)ssm教学督导管理系统 毕业设计 292346

ssm教学督导管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采SSM技术和mysql数据库来完成对系统的…

Springboot传参详解

作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性&#xff0c;喜欢跟广大ADC一起打野升级&#xff0c;欢迎您关注&…

有关SGI STL的alloc

在STL的使用者层面上&#xff0c;空间配置器一般是隐藏的&#xff0c;使用者不需要知道其具体实现细节即 可进行使用&#xff1b;但是从STL的实现角度来说&#xff0c;由于整个STL的操作对象都存放在容器之内&#xff0c;而容器 需要配置一定的空间来进行存放数据&#xff0c;因…

Mybatis:动态SQL(8)

动态SQL1. 动态sql简介2. if3. where4. trim5. choose、when、otherwise6. foreachforeach实现批量添加foreach实现批量删除7. SQL片段8. 总结1. 动态sql简介 Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能&#xff0c;它存在的意义是为了解决拼接SQL语句…

I-04Python中与C语言STL部分模板的类似模块

C语言中,我们打ACM可以用<vector>、<stack>等模板来快速实现一些经典的数据结构,可我在很多地方都没找到Python中类似于C里面的STL模板这么好用的东西.于是我在Python的标准库里面总结了些模块来直接实现类似的功能(当然也可能是我真的没找到,如果各位来客有知道的…

【浅学Java】SpringMVC程序开发

SpringMVC程序开发1. 认识SpringMVC1.1 SpringMVC是什么1.2 SpringMVC的定义1.3 MVC和SpringMVC的关系经典问题&#xff1a;Spring / SpringBoot / SpringMVC有什区别2. 学习SpringMVC的思路3. Spring MVC的创建和连接3.0 创建方法3.1 使用到的一些注解3.2 返回一个页面3.3 关于…

Qt实现全局鼠标事件监听器-Windows

Qt实现全局鼠标事件监听器-Windows版&#x1f347; 文章目录Qt实现全局鼠标事件监听器-Windows版&#x1f347;1、概述&#x1f348;2、实现效果&#x1f349;3、实现方式&#x1f34a;4、关键代码&#x1f34b;5、源代码&#x1f34c;更多精彩内容&#x1f449;个人内容分类汇…

Quartz任务调度

Quartz概念 Quartz是openSymphony开源组织在Job scheduling领域的开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合&#xff0c;也可以单独使用。 Quartz是开源且具有丰富特性的“任务调度库”&#xff0c;能够集成于任何的Java应用&#xff0c;小到独立的应用&#xf…

支持向量机SVM

文章目录SVM简单理解SVM代码实现导入数据集SVM实现画出支持向量总结SVM简单理解 在下二维平面存在以下数据点&#xff0c;不同颜色代表不同类别&#xff0c;现在需要画一条直线&#xff0c;想将两个类别分别开来&#xff0c;当有新数据加入时&#xff0c;根据这条直线&#xf…

springboot+jsp母婴用品商城网站系统

开发语言&#xff1a;Java 后端框架&#xff1a;springboot(SpringSpringMVCMyBatis) 前端框架&#xff1a;jsp 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 母婴用品网站&#xff0…

客快物流大数据项目(九十六):ClickHouse的VersionedCollapsingMergeTree深入了解

文章目录 ClickHouse的VersionedCollapsingMergeTree深入了解 一、创建VersionedCollapsingMergeTree引擎表的语法 二、折叠数据