Behavioral模式之Memento模式
1.意图
在不破坏封装性的前提下,捕获一个对象的内部状态。并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
2.别名
Token
3.动机
有时候有必要记录一个对象的内部状态。为了同意用户取消不确定的操作或从错误中恢复过来,须要实现检查点和取消机制,而要实现这些机制。你必须事先将状态信息保存在某处,这样才干是对象恢复到他们先前的状态。
4.适用性
下面情况使用Memento模式:
- 必需保存一个对象在某一时刻的(部分)状态,这样以后须要时它能恢复到先前的状态。
- 如果一个用接口来让其他对象直接得到这些状态。将会暴露对象的实现细节并破坏对象的封装性。
5.结构
主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人认为叫备份模式更形象些,通俗的讲下:如果有原始类A。A中有各种属性,A能够决定须要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢。就是一个用来存储备忘录的。且仅仅能存储,不能改动等操作。做个图来分析一下:
6.代码演示样例
Original类是原始类。里面有须要保存的属性value及创建一个备忘录类。用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类。持有Memento类的实例,该模式非常好理解。
直接看源代码:
实现代码:
数据结构:
public class Original {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Original(String value) {
this.value = value;
}
public Memento createMemento(){
return new Memento(value);
}
public void restoreMemento(Memento memento){
this.value = memento.getValue();
}
}
实现:
public class Memento {
private String value;
public Memento(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class Storage {
private Memento memento;
public Storage(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
測试类:
public class Test {
public static void main(String[] args) {
// 创建原始类
Original origi = new Original("egg");
// 创建备忘录
Storage storage = new Storage(origi.createMemento());
// 改动原始类的状态
System.out.println("初始化状态为:" + origi.getValue());
origi.setValue("niu");
System.out.println("改动后的状态为:" + origi.getValue());
// 回复原始类的状态
origi.restoreMemento(storage.getMemento());
System.out.println("恢复后的状态为:" + origi.getValue());
}
}
“`
输出:
初始化状态为:egg
改动后的状态为:niu
恢复后的状态为:egg
简单描写叙述下:新建原始类时,value被初始化为egg,后经过改动,将value的值置为niu。最后倒数第二行进行恢复状态,结果成功恢复了。事实上我认为这个模式叫“备份-恢复”模式最形象。
7.相关模式
- Command模式:命令模式能够使用备忘录来为可撤销的操作维护状态。
- Iterator模式:如前所述备忘录可用于迭代。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539
最新文章
- 每天一个 Linux 命令(8):cp 命令
- postgresql 函数demo
- Prevent Adding Component More than once
- crackme_zapline分析
- protobuf 向前兼容向后兼容
- 原生JQ实现图片滑动轮播
- [Luogu P2296][NOIP 2014]寻找道路
- VMware Workstation 10序列号:
- 在try-catch机制优化IO流关闭时,OutputStreamWriter 数据流被截断
- Visual Studio编译时报错“函数名:重定义;不同的基类型”
- centos 安装oracle 11g r2(三)-----表空间创建
- jieba分词学习
- find中的-print0和xargs中-0的奥妙
- python计算结果显示小数
- 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
- (转)C#静态方法使用经验浅谈
- Linux操作系统文件系统基础知识详解
- Fuckey V1.0 Beta版发布!!!
- win10-MySql免安装版-安装/多实例
- C#封装StackExchange.Redis操作