Memento 备忘录 快照模式
简介
定义:
- 在不破坏封装的前提下,捕获一个对象的【内部状态】,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
角色:
- 发起人Originator:要被备份的成员,它提供一创建备忘录的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中。并提供另外一个方法将备忘录中的信息覆盖自身的信息。
- 备忘录Memento:备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态。
- 管理角色(Caretaker):用于管理备忘录对象的实现类。
适用场合:
- 它适用于对象在执行某些操作时,为防止意外,而在执行操作前,将对象状态备份的场景,有点类似于【事务回滚】的意思。
- 功能比较复杂的,但是需要维护或记录属性历史的类
- 需要保存的属性只是众多属性的一小部分时
好处:
- 有时一些发起人对象的内部信息必须【保存在】发起人对象以外的地方,但是必须要由发起人对象自己读取,这时使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持【封装】的边界
- 本模式【简化】了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本
- 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原
缺点:
- 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在【资源消耗】上面备忘录对象会很昂贵
- 当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵
演示
/** 发起人Originator,要【被备份】的类 */public class Originator {/**需要被保存的内部状态*/public String date;public int num;/**提供一个【创建备忘录】的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中(或者可以直接将对象自身this作为参数传入) */public Memento createMemento() {return new Memento(this);}/**提供一个将备忘录中的信息【覆盖】自身信息的方法*/public void setMemento(Memento memento) {date = memento.date;num = memento.num;}public void show() {System.out.println(date + "---" + num);}}/**备忘录Memento,备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态 */public class Memento {public String date;public int num;public Memento(Originator org) {this.date = org.date;this.num = org.num;}}/** 管理角色Caretaker,用于管理备忘录对象。不能对备忘录的内部进行操作或检查 */public class Caretaker {private Memento memento;public Memento getMemento() {return this.memento;}public void setMemento(Memento memento) {this.memento = memento;}}public class Test {public static void main(String[] args) {//原始数据Originator org = new Originator();org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());org.num = 99;org.show();//创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复Memento memento = org.createMemento();// 创建一个备忘录管理类,用于管理备忘录对象(其实基本没什么卵用)Caretaker ctk = new Caretaker();ctk.setMemento(memento);//改变原始数据的状态org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());org.num = 100;org.show();Memento memento2 = org.createMemento();// 恢复之前保存的状态(将保存的数据导入)org.setMemento(ctk.getMemento());org.show();ctk.setMemento(memento2);org.setMemento(ctk.getMemento());org.show();}}去除掉管理类public class Test {public static void main(String[] args) {//原始数据Originator org = new Originator();org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());org.num = 99;org.show();//创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复Memento memento = org.createMemento();//改变原始数据的状态org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());org.num = 100;org.show();Memento memento2 = org.createMemento();// 恢复之前保存的状态(将保存的数据导入)org.setMemento(memento);org.show();org.setMemento(memento2);org.show();}}
附件列表
Memento 备忘录 快照模式的更多相关文章
- Memento 备忘录 快照模式 MD
备忘录模式 简介 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供 ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- 设计模式(18)--Memento(备忘录模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...
- 设计模式20:Memento 备忘录模式(行为型模式)
Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某 ...
- 设计模式学习笔记--备忘录(Mamento)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...
- 十八、Memento 备忘录设计模式
原理: 代码清单: Memento public class Memento { int mondey; ArrayList fruits; Memento(int mondey){ this.mon ...
- 23种设计模式 - 状态变化(Memento备忘录 - State)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...
- 15天玩转redis —— 第十篇 对快照模式的深入分析
我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案. 一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是S ...
- 18、Memento 备忘录模式
例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...
随机推荐
- Android中的Selector的用法
转自: Android中的Selector主要是用来改变ListView和Button控件的默认背景.其使用方法可以按一下步骤来设计: (以在mylist_view.xml为例) 1.创建mylist ...
- bzoj3864: Hero meet devil
Description There is an old country and the king fell in love with a devil. The devil always asks th ...
- SignalR实现B/S系统对windows服务运行状态的监测
基于SignalR实现B/S系统对windows服务运行状态的监测 通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windo ...
- 1. android
http://blog.csdn.net/mirkerson/article/details/7238815
- Truck History(poj 1789)
Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...
- vijos1082丛林探险
P1082丛林探险 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险. ...
- (转载)eclipse 快捷键大全,eclipse查找类,文件,添加注释
(转载)http://hi.baidu.com/fegro/item/8224c8c28b174627ee466598 /* ----------------------------------- ...
- 线性代数(矩阵乘法):POJ 2778 DNA Sequence
DNA Sequence Description It's well known that DNA Sequence is a sequence only contains A, C, T and ...
- 数学概念——F 概率(经典问题)birthday paradox
F - 概率(经典问题) Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit S ...
- 暴力求解——POJ 1321 棋盘问题
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...