【设计模式-备忘录模式】
时间:2022-07-24
本文章向大家介绍【设计模式-备忘录模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【导读】浏览器网址框旁边会有一个点击可后退的按钮,点击之后可返回上一个浏览页面。这就是备忘录模式。利用某种数据结构保存之前的状态。
一、定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
二、实例
比如日常编写word文档的时候,除了经常使用CV大法之外,还有撤回快捷键Ctrl+Z,可返回到上一个保存的状态。
文章对象:
public class Article {
//标题
private String title;
//内容
private String content;
public Article(String title, String content) {
this.title = title;
this.content = content;
}
//撤回操作
public void recover(ArticleMemento articleMemento) {
this.title = articleMemento.getTitle();
this.content = articleMemento.getContent();
}
//保存为一个缓存对象
public ArticleMemento saveToCache(){
ArticleMemento articleMemento = new ArticleMemento(title,content);
return articleMemento;
}
}
文章缓存对象:
1、属性跟文章对象一致
public class ArticleMemento {
private String title;
private String content;
public ArticleMemento(String title, String content) {
this.title = title;
this.content = content;
}
}
缓存对象管理:
public class ArticleMementoManager {
private static final Stack<ArticleMemento> stack = new Stack<ArticleMemento>();
//将缓存对象入栈,相当于word的保存按钮
public void addMemento(ArticleMemento articleMemento){
System.out.println("将【"+articleMemento.toString()+"】进行暂存");
stack.push(articleMemento);
}
//撤回,将最后一个缓存对象出栈,相当于撤回
public ArticleMemento recover(){
ArticleMemento pop = stack.pop();
return pop;
}
}
利用栈先进后出的特性保存缓存对象。
测试代码:
ArticleMementoManager articleMementoManager = new ArticleMementoManager();
Article article = new Article("标题","内容");
System.out.println("新建一篇文章:【"+article.toString()+"】");
ArticleMemento articleMemento = article.saveToCache();
articleMementoManager.addMemento(articleMemento);
article.setContent("第一次修改内容");
System.out.println("将文章修改为:【"+article.toString()+"】");
articleMemento = article.saveToCache();
articleMementoManager.addMemento(articleMemento);
article.setTitle("第一次修改标题");
System.out.println("将文章修改为:【"+article.toString()+"】");
System.out.println("需要对文章进行第一次回退操作");
article.recover(articleMementoManager.recover());
System.out.println("回退之后文章为:【"+article.toString()+"】");
System.out.println("需要对文章进行第二次回退操作");
article.recover(articleMementoManager.recover());
System.out.println("回退之后文章为:【"+article.toString()+"】");
运行结果:
整体流程如下:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于Canal与Flink实现数据实时增量同步(二)
- Spring第四天:SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用
- IDEA 下单程序多端口不同配置独立运行
- 基于Canal与Flink实现数据实时增量同步(一)
- 8848钛金手机之nacos的注册发现
- 让你git 时不再输入账号和密码
- JS 实现点击按钮复制一段文字
- Python操作Excel合并单元格
- CRM第一天:客户关系管理系统的环境搭建和注册
- lambda 表达式导致 Arthas 无法 redefine 的问题
- 战士上战场,还不会部署kubernetes集群?
- 使用docker python 的最新版本以及pip 安装模块
- Java面试题总结之数据库与SQL语句
- Python脚本命令行执行隐藏密码等敏感信息
- 使用SRS Docker搭建自己的直播平台