设计模式之GOF23备忘录模式
备忘录模式Memento
场景:
-Word文档编辑时,电脑死机或者断电,再次打开时,word提醒恢复之前的文档
-文件的撤回
核心:
-就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态
结构:
-源发器类Originator(需要备忘的对象,内部可以创建备忘录,用于记录当前时刻它的内部状态,并可使用备忘录回恢复内部状态)
-备忘录类Menmeto9(负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录)
-负责人类CareTaker(负责管理备忘录类)
备忘点较多时:
-将备忘录压栈:
public class CareTaker{
private Memento memento;
private Stack<Memento> stack=new Stack<>();
}
-将多个备忘录对象,序列化和持久化(存在硬盘上)
开发中的场景:
-棋类游戏中,悔棋
-撤销操作
-数据库软件中,事务管理中的回滚操作
-PS中的历史记录
/**
* 源发器类
* @author 小帆敲代码
*
*/
public class Emp {
private String ename;
private int age;
private double salary;
//构建备忘录对象
public Memento getMemento() {
return new Memento(this);
}
//进行数据恢复,恢复成指定备忘录对象的值
public void recovery(Memento m) {
this.setEname(m.getEname());
this.setAge(m.getAge());
this.setSalary(m.getSalary());
}
public Emp(String ename, int age, double salary) {
this.ename = ename;
this.age = age;
this.salary = salary;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
/**
* 备忘录
* @author 小帆敲代码
*
*/
public class Memento {
private String ename;
private int age;
private double salary;
public Memento(Emp e) {
this.ename = e.getEname();
this.age = e.getAge();
this.salary = e.getSalary();
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
* 负责人类
* 负责管理备忘录
* @author 小帆敲代码
*
*/
public class CareTaker {
private Memento mmt;
//private List<Memento> list=new ArrayList<>();
public CareTaker(Memento mmt) {
this.mmt = mmt;
}
}
return mmt;
}
this.mmt = mmt;
}
}
public static void main(String[] args) {
CareTaker ct= new CareTaker();
Emp e=new Emp("小张",18,10000);
System.out.println("第一次打印对象:"+e.getEname()+"---"+e.getAge()+"---"+e.getSalary());
//做备忘
ct.setMmt(e.getMemento());
e.setAge(30);
e.setEname("老张");
e.setSalary(10000000);
System.out.println("第二次打印对象:"+e.getEname()+"---"+e.getAge()+"---"+e.getSalary());
//恢复
e.recovery(ct.getMmt());
System.out.println("第三次打印对象:"+e.getEname()+"---"+e.getAge()+"---"+e.getSalary());
}
}

设计模式之GOF23备忘录模式的更多相关文章
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
- IOS设计模式之四(备忘录模式,命令模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
- java设计模式-----21、备忘录模式
概念: Memento模式也叫备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式,它的作用是保存对象的内部状态,并在需要的时候(u ...
- Java描述设计模式(24):备忘录模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...
- 大话设计模式Python实现-备忘录模式
备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...
- C#设计模式系列:备忘录模式(Memento)
1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { ...
- 设计模式のMementoPattern(备忘录模式)----行为模式
一.产生背景 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态, ...
随机推荐
- C - Ivan the Fool and the Probability Theory---div2
题目连接:https://codeforces.com/contest/1248/problem/C 思路: 注意上下两排的关系,如果说上面那一排有两个方格连续,那么他相邻的两排必定和他相反,如果说当 ...
- api_DZFPKJ & api_DZFPCX(get_AES_url代码优化)
通过AES加密网站的接口来传值,不需要手动加密字符串后复制过来传值. #coding:utf-8 import requests import re def get_aes_url(key, text ...
- vue2.x学习笔记(十九)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12631022.html. 程序化的事件侦听器 在前面的学习中,我们已经知道了[$emit]全局属性的用法,它可以被 ...
- 【题解】POJ3041 Asteroids - 图论 - 二分图匹配
声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 POJ3041 Asteroids 题目描述 假如你现在正处在一个 \(N*N\ ...
- 吃瓜的正确姿势,Python绘制罗志祥词云图
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 这篇文章中向大家介绍了Python绘制词云的方法,不难看出绘制词云可以说是一 ...
- Caused by: java.io.IOException: Type mismath in vlaue from map: excepted org.apache.hadoop.io.InaWritable,received SC
解决办法: 看map和reduce的输入是不是对应,看看map和reduce设置的参数和下面的是否一致
- 2019-2020-1 20199303 《Linux内核原理与分析》 第十一周作业
缓冲区溢出漏洞实验 安装一些用于编译C程序的32位软件包 sudo apt-get install -y lib32z1 libc6-dev-i386 sudo apt-get install -y ...
- SVN部署(Centos7,Ubuntu)
SVN 简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Sub ...
- windows 查看被占用的端口信息
如何查询 1.使用命令:netstat -aon|findstr "8080" 查询被占用的端口的进程 PID 2.使用命令:tasklist | findstr "15 ...
- Crash日志解析
当应用程序崩溃时,会创建一个崩溃报告,这对于了解导致崩溃的原因非常有用.本文档包含有关如何表示,理解和解释崩溃报告的基本信息. 1.介绍 2.获取崩溃和低内存报告 3.象征性的奔溃报告 1.位码(bi ...