设计模式笔记十九:备忘录模式
原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。
备忘录模式(Memento Pattern)(本文大部分摘自原文)
保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
意图:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:
所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:
很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有”后悔药”可吃。
如何解决:
通过一个备忘录类专门存储对象状态。
关键代码:
客户不与备忘录类耦合,与备忘录管理类耦合。
类比现实:
1、后悔药。
2、打游戏时的存档。
3、Windows 里的 ctri + z。
4、IE 中的后退。
4、数据库的事务管理。
优点:
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景:
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。
注意事项:
1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。
代码实现
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。
备忘录模式的 UML 图
步骤 1
创建 Memento 类。
Memento.java
//状态存储地
public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}
步骤 2
创建 Originator 类。
Originator.java
//存储方法所在
//获取或者保存Memento的数据
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();}
}
步骤 3
创建 CareTaker 类。
CareTaker.java
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 List<Memento> getMementoList(){return mementoList;}public Memento get(int index) {return mementoList.get(index);}
}
步骤 4
使用 CareTaker 和 Originator 对象。
MementoPatternDemo.java
public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();CareTaker careTaker = new CareTaker();originator.setState("state 1");careTaker.add(originator.saveStateToMemento());originator.setState("state 2");careTaker.add(originator.saveStateToMemento());originator.setState("state 3");
// careTaker.add(originator.saveStateToMemento());originator.setState("state 4");careTaker.add(originator.saveStateToMemento());for(Memento memento : careTaker.getMementoList()){System.out.println(memento.getState());}}
}
步骤 5
验证输出。
state 1
state 2
state 4
设计模式笔记十九:备忘录模式相关推荐
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- (原创)无废话C#设计模式之十九:Observer
无废话C#设计模式之十九:Observer 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 场景 这次不说游戏了,假设我们需要在一个W ...
- Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法
Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...
- 云计算设计模式(十)——守门员模式
云计算设计模式(十)--守门员模式 通过使用充当客户端和应用程序或服务之间的代理,验证和进行消毒的请求,并将它们之间的请求和数据的专用主机实例保护的应用程序和服务.这可以提供一个额外的安全层,并限制了 ...
- 设计模式(十九)—— 备忘录模式
模式简介 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 很多时候我们要记录一个对象的内部状态,为了允许用户撤销不确定的操作或从 ...
- 【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码
本文是以下几篇文章对应的动态加载的用户程序/任务一代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 ...
- 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
本汇编代码对应以下两篇文章对应的用户程序汇编代码: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中 ...
- 从王者荣耀看设计模式(二十二.备忘录模式)
从王者荣耀看设计模式 一.简介 点击王者荣耀商店法术的装备栏,存在有"贤者的庇护"这一装备.在对战中,当玩家处于死亡状态时,会触发此装备的效果,能够让英雄重新复活. ┬┴┬┌─ ● ...
- Java笔记-Java中备忘录模式
首先设计模式代表外招功法,是外招的模板,个人觉得他是为面向对象7个原则而准备的: 面向对象程序设计要考虑7个原则: 单一职责原则:设计目的单一的类: 开放封闭原则:对扩展开发,对修改封闭: 李氏替换原 ...
最新文章
- 一个httpwebrequest异步下载的例子
- express细节点注意
- Zuul:路由转发,排除和自定义
- oracle 长事务 逻辑日志,goldengate中长事务引起的问题
- python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...
- 使用函数计算打包下载OSS文件
- 自定义---单批次训练函数
- TimeUnit类中的sleep() 和Thread.sleep()
- Lan Xiang's Square nyoj 1099(已经四边形四点坐标 如何判断正方形)
- 极光推送JPush使用Java SDK开发
- photoshop插件开发
- vue分享至qq空间,新浪微博,微信朋友圈及微信好友
- 查找整数c语言程序,查找整数(示例代码)
- 智能优化算法:海鸥算法原理及Matlab代码
- 深度学习之目标检测--Pytorch实战
- 编程入门先学哪种语言好
- 密码学基础-AES加解密Python代码实现
- 手机一个2k屏60hz,一个1080p屏90hz,哪个好呀?
- 可汗学院 统计学习第一天
- mac强制退出程序的几种方法
热门文章
- group by两个条件
- Luogu P1311 选择客栈(前缀和)
- 我在使用vector时候遇到的二逼问题
- xcode4.5 iOS6 cocos2d-x 横屏解决方案
- ASP.net 省市级联(用户控件)适用用framework3.5以上版本
- 宏定义 是否retina高清屏,判断当前设备
- EntLib 3.1学习笔记(2) : Data Access Application Block
- 达内android 代码,深圳达内Android网页源码查看器.pdf
- 复习:顺序表——链表
- 数据 3 分钟 | 《数据安全法》即将施行;ACM SIGMOD在西安举办;艾瑞咨询发布数据库行业报告...