Memento 备忘录 快照模式 MD
| 我的GitHub | 我的博客 | 我的微信 | 我的邮箱 |
|---|---|---|---|
| baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
备忘录模式
简介
在不破坏封装的前提下,捕获一个对象的【内部状态】,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
角色:
- 发起人Originator:要被备份的成员,它提供一创建备忘录的方法,其实就是
将它自身的某些信息拷贝一份放到一个备忘录对象中。并提供另外一个方法将备忘录中的信息覆盖自身的信息。 - 备忘录Memento:备忘录对象中
包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态。 - 管理角色Caretaker:用于管理备忘录对象的实现类。
适用场合:
- 它适用于对象在执行某些操作时,为防止意外,而在执行操作前,将对象状态备份的场景,有点类似于【事务回滚】的意思。
- 功能比较复杂的,但是需要维护或记录属性历史的类
- 需要保存的属性只是众多属性的一小部分时
好处:
- 有时一些发起人对象的内部信息必须【保存在】发起人对象以外的地方,但是必须要由发起人对象自己读取,这时使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持【封装】的边界
- 本模式【简化】了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本
- 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原
缺点:
- 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在【资源消耗】上面备忘录对象会很昂贵
- 当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵
案例
发起人Originator
要【被备份】的类
public class Originator {
public String date; //需要被保存的内部状态
public int num; //需要被保存的内部状态
//提供一个【创建备忘录】的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中
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();
//恢复之前保存的状态(将保存的数据导入)
org.setMemento(ctk.getMemento());
org.show();
}
}
去除掉管理类
public class Test {
public static void main(String[] args) {
Originator org = new Originator();//原始数据
//...对原始数据进行各种操作
Memento memento = org.createMemento(); //创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复
//...改变原始数据的状态
org.setMemento(memento);//恢复之前保存的状态(将保存的数据导入)
org.show();
}
}
2016-04-20
Memento 备忘录 快照模式 MD的更多相关文章
- Memento 备忘录 快照模式
简介 定义: 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人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设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...
随机推荐
- Python并发编程-IO模型-IO多路复用实现SocketServer
Server.py import select import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.setblockin ...
- 一文搞定 Mybatis 的应用
Mybatis 介绍 Mybatis 是一个开源的持久层框架,原来叫 ibatis ,它对 jdbc 操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动. ...
- Openstack_通用模块_Oslo_vmware 创建 vCenter 虚拟机快照
创建虚拟机快照 vSphere Create Snapshot 文档 Snapshot 是虚拟机磁盘文件(VMDK)在某个点及时的复本.包含了虚拟机所有虚拟磁盘上的数据状态和这个虚拟机的电源状态(on ...
- MSSQL 基础知识与语句笔记
建库 CREATE DATABASE 数据库名 ON[PRIMARY] --默认属于PRIMARY主文件组,可省略 ( NAME='', --主数据文件的逻辑名 名称 FILEAME='', --主数 ...
- 02-c#基础之01-基础语法(三)
1.赋值运算符:"=" =:表示赋值的意思,表示把等号右边的值,赋值给等号左边的变量. 由等号连接的表达式称之为赋值表达式. 注意:每个表达式我们都可以求解除一个定值,对于赋值表达 ...
- Codeforces.714D.Searching Rectangles(交互 二分)
题目链接 \(Description\) 在一个\(n*n\)的二维平面中有两个不相交的整点矩形,每次可以询问两个矩形有几个完全在你给出的一个矩形中.200次询问内确定两个矩形坐标. \(Soluti ...
- 【推导】zoj3846 GCD Reduce
题意:给你n个正整数a1...an,一次操作是选择任意两个数ai,aj,将它们都替换成gcd(ai,aj).让你在5n步内将所有数变为1.或者输出不可能. 如果所有数的gcd不为1,显然不可能. 否则 ...
- [CC-SEINC]Sereja and Subsegment Increasings
[CC-SEINC]Sereja and Subsegment Increasings 题目大意: 有长度为\(n(n\le10^5)\)的序列\(A\)和\(B\). 在一次操作中,可以选择一个区间 ...
- 在windows安装配置Git开发环境
开始配置Git的开发环境.首先从google code下载最新的windows的git安装包msysgit,当时我下载的是Git-1.7.4-preview20110204.exe,然后就开始安装了 ...
- Trie树之C-实现
title: Trie树之C++实现 comments: true date: 2016-10-02 16:59:54 categories: 算法 tags: Trie树 前言 之前写了一篇偏向于理 ...