【行为型模式】备忘录模式

news2024/11/23 4:10:39

一、备忘录模式概述

        备忘录模式定义又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样我们就可以在需要的时候将该对象恢复到原先保存的状态了。(对象行为型)

备忘录模式有两个目标:

  • 储存系统关键对象的重要状态;
  • 维护关键对象的封装。

  • 备忘录模式的优缺点
    • 优点
      • 1.将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚;
      • 2.提供了容易实现的恢复能力;
      • 3.保持关键对象的数据封装。
    • 缺点:
      • 储存和恢复状态的过程可能相当耗时。
  • 适用环境
    • 1.需要保存历史快照的场景;
    • 2.希望在对象之外保存状态,且除了自己其他对象无法访问状态的具体保存内容。

二、代码实现

        备忘录模式主要有3个角色:

  • 发起人(Originator)角色:负责创建一个备忘录,记录自身需要保存的状态,而且需要具备状态的回滚功能。
  • 备忘录(Memento)角色:用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问。
  • 备忘录管理员(Caretaker)角色:负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问。
        2.1 Originator
package Memento.example;
//发起人角色
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();
	}
}
        2.2 Memento
package Memento.example;
//备忘录角色
public class Memento {
	private String state;

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

	public String getState() {
		return state;
	}
}
        2.3 Caretaker
package Memento.example;
//备忘录管理员
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);
   }
}
        2.4 客户端
package Memento.example;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		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("Current State: " + originator.getState());    
	      originator.getStateFromMemento(careTaker.get(0));
	      System.out.println("First saved State: " + originator.getState());
	      originator.getStateFromMemento(careTaker.get(1));
	      System.out.println("Second saved State: " + originator.getState());
	}

}
        2.5 UML图

三、代码结构图

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

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

相关文章

软件测试的内容包含什么内容

软件测试的内容涵盖了多个方面&#xff0c;以确保软件的质量和性能达到既定的标准。这些内容包括但不限于以下几点&#xff1a; 注册信息验证&#xff1a;对软件产品的基本信息进行验证&#xff0c;如软件名称、版本号、开发者等&#xff0c;确保这些信息的准确性和一致性。功…

Mysql事务—隔离级别—脏读、不可重复读、幻读-遥遥领先版

事务的基本概念 事务就是一组原子性的操作&#xff0c;这些操作要么全部发生&#xff0c;要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。 事务最经典也经常被拿出来说例子就是转账了。 假如小明要给小红转账1000元&#xff0c;这个转账会涉及到两个…

Java全栈开发前端+后端(全栈工程师进阶之路)-环境搭建

在课程开始前我们要配置好我们的开发环境&#xff0c;这里我的电脑太乱了&#xff0c;我使用vm虚拟机进行搭建开发环境&#xff0c;如果有需要环境的或者安装包&#xff0c;可以私信我。 那我们开始 首先我们安装数据库 这里我们使用小皮面板 小皮面板(phpstudy) - 让天下没…

【一刷《剑指Offer》】面试题 11:数值的整数次方

力扣对应题目链接&#xff1a;50. Pow(x, n) - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;数值的整数次方_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》内容 二、分析题目 【快速幂 递归】 当指数 n 为负数时&#xff0c;我们可以计算 x^(−…

大模型应用开发极简入门

简单的归纳一下书的前序部分 目录 LLM&#xff08;Large Language Model&#xff09;的应用技术栈通常包括以下几个方面&#xff1a; 深度学习框架&#xff1a; 数据预处理工具&#xff1a; 训练资源&#xff1a; 模型优化和调参工具&#xff1a; 部署和应用集成&#xf…

基于Vue3的Axios异步请求

基于Vue3的Axios异步请求 1. Axios安装与应用2. Axios网络请求封装3. axios网络请求跨域前端解决方案server.proxy 1. Axios安装与应用 Axios是一个基于promise的网络请求库&#xff0c;Axios.js.中文文档&#xff1a;https://axios.js.cn/ 安装&#xff1a;npm install --sa…

链表之两数相加

两数相加 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&am…

简单几步!新手开抖店如何快速上手?看这一篇就够了!

大家好&#xff0c;我是电商花花。 很多新手卖家在做抖音小店的时候都是0基础的小白&#xff0c;在开好店铺之后却不知道如何下手。 那么今天花花就来跟 大家分享一下我们是怎么做抖音小店&#xff0c;怎么做店铺运营的&#xff0c;如果你作为一个刚开店的新手&#xff0c;一…

Java的逻辑控制和方法的使用介绍

前言 程序的逻辑结构一共有三种&#xff1a;顺序结构、分支结构和循环结构。顺序结构就是按代码的顺序来执行相应的指令。这里主要讲述Java的分支结构和循环结构&#xff0c;由于和C语言是有相似性的&#xff0c;所以这里只会提及不同点和注意要点~~ 注意在C语言中&#xff0c;…

MobileNetV4 论文学习

论文地址&#xff1a;https://arxiv.org/abs/2404.10518 代码地址&#xff1a;https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobilenet.py 解决了什么问题&#xff1f; 边端设备的高效神经网络不仅能带来实时交互的体验&#xff0c…

Linux服务器安全基础 - 查看入侵痕迹

1. 常见系统日志 /var/log/cron 记录了系统定时任务相关的日志 /var/log/dmesg 记录了系统在开机时内核自检的信息&#xff0c;也可以使用dmesg命令直接查看内核自检信息 /var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. /var/log/btmp:记…

XYCTF 2024

Web 参考博客&#xff1a;https://www.yuque.com/yunzhiyunweiji/wrgkex/rfpnkn0293l7cp09#ezMake ezhttp Via - HTTP | MDN 代理那里难住了 XFF不给用可以用client-ip ezmd5 让我们上传图片并比较&#xff0c;结合题目名可以猜测应该是比较两个图片的md5值是否相同&…

实锤!腾讯终于拥抱鸿蒙生态,微信鸿蒙原生版本即将上线

大家都知道&#xff0c;目前已知纯血鸿蒙星河版next将于今年6月份开启Bate版本的测试&#xff0c;也就是说原生鸿蒙系统快上线了。而目前对于鸿蒙生态的发展&#xff0c;大家最关心的恐怕只有腾讯系的微信和QQ是否适配了纯血鸿蒙系统。甚至有网友表示&#xff0c;微信不适配鸿蒙…

上海计算机学会2020年9月月赛C++丙组T2中心对称数

题目背景 在超市里&#xff0c;有一些价格标签倒置后&#xff0c;数字竟不会发生改变。转置 180 度后不变的十进制数字被称为中心对称数&#xff08;Strobogrammatic Numbers&#xff09;。下图分别给出 0 到 9 这十个数字倒置后的样子&#xff1a; 题目描述 中心对称数是指沿…

npm 安装 pnpm 时 报错 npm ERR! Unexpected token ‘.‘

问题 一个项目用的是 pnpm 安装的依赖&#xff0c;node 的版本是 16.16.0&#xff0c;nvm 的版本是 1.1.7&#xff0c;然后全局安装 pnpm 报错如下&#xff1a; 解决 我看网上的一些解决方案是说 nvm 版本过低导致&#xff0c;下面我们按照这个方向处理。 实首先下载 nvm-up…

第三节课,功能2:开发后端用户的管理接口--http client -- debug测试

一、idea 中 Http client 使用 二、测试步骤&#xff0c;先进入主程序 2.1 先run &#xff0c;再debug 2.2 再进入想要测试的代码 2.2.1 进入测试的接口 三、程序逻辑 1&#xff09;用户注册逻辑&#xff1a;如果用户不存在再后端&#xff0c;看用户名&密码&校验码是…

制造企业如何打造客户服务核心竞争力?[AMT企源典型案例]

引言 产品同质化严重&#xff0c;竞争的焦点从产品转向服务&#xff0c;企业的管理模式也要相应转变。那么如何打造围绕服务的核心竞争力&#xff1f;相信以下案例会给大家一些启发。 项目背景&#xff1a; 售后服务在市场竞争中的作用凸显 A公司是一家医疗器械生产制造企业…

揭秘商业新宠——消费全返模式:深度剖析与实战策略

大家好&#xff0c;我是微三云周丽&#xff01; 在当今竞争激烈的商业环境中&#xff0c;创新已成为企业生存和发展的关键。在众多新型商业模式中&#xff0c;消费全返模式凭借其独特的魅力&#xff0c;吸引了众多商家的目光。本文将从消费全返模式的定义、特点、应用场景、成…

蚂蚁集团智能凭证安全产品通过信通院能力测评,获最高评级

4月28日&#xff0c;中国信通院“人工智能”高质量发展研讨会在北京召开。会上&#xff0c;中国信通院发布“可信AI”系列评测结果。蚂蚁集团智能凭证防伪检测安全产品“蚂蚁光鉴”全项通过“可信AI-OCR服务智能化”的评估&#xff0c;获得最高评级&#xff08;增强级&#xff…

数字电路-5路呼叫显示和8路抢答器

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…