- 浏览: 97992 次
- 性别:
- 来自: 深圳
文章分类
最新评论
Memento模式也叫备忘录模式,是由GoF提出的23种软件设计模式的一种。Memento模式是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
本文介绍设计模式中的(Memento)模式的概念,用法,以及实际应用中怎么样使用Memento模式进行开发。
Memento模式的概念
Memento模式是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
Memento的英文原意包含有纪念物,快照,备忘录的意思,Memento模式取意使用memento来保存对象现有的状态,从而可以在将来需要的时候把这个对象还原到以前被保存的状态。
Memento模式的角色:
Originator(原生者)
需要被保存状态以便恢复的那个对象。
Memento(备忘录)
该对象由Originator创建,主要用来保存Originator的内部状态。
Caretaker(管理者)
负责在适当的时间保存/恢复Originator对象的状态。
Memento的英文原意包含有纪念物,快照,备忘录的意思,Memento模式取意使用memento来保存对象现有的状态,从而可以在将来需要的时候把这个对象还原到以前被保存的状态。
Memento模式的角色:
Originator(原生者)
需要被保存状态以便恢复的那个对象。
Memento(备忘录)
该对象由Originator创建,主要用来保存Originator的内部状态。
Caretaker(管理者)
负责在适当的时间保存/恢复Originator对象的状态。
Memento模式的应用场景
如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
1)一个类需要保存它的对象的状态(相当于Originator角色)
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态
1)一个类需要保存它的对象的状态(相当于Originator角色)
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态
Memento模式的应用范例
Memento模式比较简单,我们只需要按照上面所介绍的步骤就可以实现Memento模式。
下面,我们使用Memento模式模拟下面这个操作:
对字符串做append操作,每操作一次计数器+1,这个操作由Originator类实现;另外,我们需要在适当的时候恢复操作之前的状态加以回退(undo)。
文件一览:
Client
测试类。
Memento
Memento备忘录类。保持Originator对象的状态。
Originator
需要保持/恢复状态的类。该类有2个状态需要保存String data以及int count。
Caretaker
管理者类,根据情况可以省略。
代码:
下面,我们使用Memento模式模拟下面这个操作:
对字符串做append操作,每操作一次计数器+1,这个操作由Originator类实现;另外,我们需要在适当的时候恢复操作之前的状态加以回退(undo)。
文件一览:
Client
测试类。
Memento
Memento备忘录类。保持Originator对象的状态。
Originator
需要保持/恢复状态的类。该类有2个状态需要保存String data以及int count。
Caretaker
管理者类,根据情况可以省略。
代码:
public class Client {
/**
* Test Memento Pattern
*/
public static void main(String[] args) {
//创建目标对象
Originator org = new Originator();
org.setData("aaa");
System.out.println("Original value: [" + org.getData() + ", " + org.getCount() + "]");
//创建目标对象的一个快照
Memento snapshot = org.createMemento();
//通过Caretaker保存此快照
Caretaker caretaker = new Caretaker();
caretaker.setMemento(snapshot);
//操作目标对象改变目标对象的值
org.append("bbb");
org.append("ccc");
System.out.println("Updated value: [" + org.getData() + ", " + org.getCount() + "]");
//还原
org.setMemento(caretaker.getMemento());
System.out.println("Restored value: [" + org.getData() + ", " + org.getCount() + "]");
}
}
/**
* Originator
*
*/
class Originator {
private String data = "";
private int count = 0;
public void append(String expr) {
data += expr;
count++;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Memento createMemento() {
return new Memento(data, count);
}
public void setMemento(Memento memento) {
data = memento.getData();
count = memento.getCount();
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
/**
* Memento
*
*/
class Memento {
private String data;
private int count = 0;
public Memento(String data, int count) {
this.data = data;
this.count = count;
}
public String getData() {
return data;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
/**
* Caretaker
*
*/
class Caretaker {
Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
/**
* Test Memento Pattern
*/
public static void main(String[] args) {
//创建目标对象
Originator org = new Originator();
org.setData("aaa");
System.out.println("Original value: [" + org.getData() + ", " + org.getCount() + "]");
//创建目标对象的一个快照
Memento snapshot = org.createMemento();
//通过Caretaker保存此快照
Caretaker caretaker = new Caretaker();
caretaker.setMemento(snapshot);
//操作目标对象改变目标对象的值
org.append("bbb");
org.append("ccc");
System.out.println("Updated value: [" + org.getData() + ", " + org.getCount() + "]");
//还原
org.setMemento(caretaker.getMemento());
System.out.println("Restored value: [" + org.getData() + ", " + org.getCount() + "]");
}
}
/**
* Originator
*
*/
class Originator {
private String data = "";
private int count = 0;
public void append(String expr) {
data += expr;
count++;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Memento createMemento() {
return new Memento(data, count);
}
public void setMemento(Memento memento) {
data = memento.getData();
count = memento.getCount();
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
/**
* Memento
*
*/
class Memento {
private String data;
private int count = 0;
public Memento(String data, int count) {
this.data = data;
this.count = count;
}
public String getData() {
return data;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
/**
* Caretaker
*
*/
class Caretaker {
Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
执行Client,输出结果:
C:\Memento>javac *.java
C:\Memento>java Client
Original value: [aaa, 0]
Updated value: [aaabbbccc, 2]
Restored value: [aaa, 0]
C:\Memento>
C:\Memento>java Client
Original value: [aaa, 0]
Updated value: [aaabbbccc, 2]
Restored value: [aaa, 0]
C:\Memento>
Originator对象的初始状态为[aaa, 0],经过某些操作,变为[aaabbb, 2],经过Memento模式处理之后,又复原到了[aaa, 0]。
后记:
1,Command模式也可以用来恢复对象的状态,一般Command模式可以支持多级状态的回退,Memento只是简单的恢复(一级);其实,Command模式在每一个undo中,可以使用Memento来保存对象的状态。
- Command can use Memento to maintain the state required for an undo operation. [GoF, p242]
2,从Originator对象到Memento的过程是一个对象拷贝的操作,Java语言的克隆与深层次克隆技术入门与精通 一文比较深入地介绍了对象间的拷贝技术。
后记:
1,Command模式也可以用来恢复对象的状态,一般Command模式可以支持多级状态的回退,Memento只是简单的恢复(一级);其实,Command模式在每一个undo中,可以使用Memento来保存对象的状态。
- Command can use Memento to maintain the state required for an undo operation. [GoF, p242]
2,从Originator对象到Memento的过程是一个对象拷贝的操作,Java语言的克隆与深层次克隆技术入门与精通 一文比较深入地介绍了对象间的拷贝技术。
发表评论
-
设计模式之 State - 状态模式
2010-12-18 16:49 1068State模式也叫状态模式,是由GoF提出的23种软件设计模式 ... -
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1337Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1440Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1556Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1367Observer模式也叫观察者 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1099Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Iterator - 迭代模式
2010-12-18 16:27 1157Iterator模式也叫迭代模式,是由GoF提出的23种设 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 976Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 858Command(CoR)模式也叫命 ... -
设计模式之 Chain of Responsibility - 职责链模式
2010-12-18 16:18 1187Chain of Responsibility(CoR)模 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1033Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Flyweight - 享元模式
2010-12-16 23:42 1026Flyweight模式也叫享元模式,是由GoF提出的23种 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 985Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 840Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 796装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1443Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1001Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 901Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1120Prototype模式也叫原型模式,是由GoF提出的23种设计 ... -
设计模式之 Builder - 建造者模式
2010-11-18 23:51 1030Builder模式也叫建造者模式或者生成器模式,是由GoF ...
相关推荐
备忘录(Memento)模式又叫作快照(Snapshot)模式或Token模式,是一种对象的行为模式。在备忘录模式里,一个备忘录是一个对象,它存储另一个对象(备忘录的原发器)在某个瞬间的内部状态。备忘的目的就是为了以后在需要...
c++设计模式-行为型模式-备忘录模式;qt工程;c++简单源码;备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先...
C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式
C++设计模式课件19_Memento_备忘录.pdfC++设计模式课件19_Memento_备忘录.pdf
备忘录模式C++实现,若理解有误,请留言指出。
备忘录模式(Memento) 用意:用来存储另一对象内部状态的快照。
C#面向对象设计模式 (行为型模式) Memento 备忘录模式 视频讲座下载
这是运用Memento设计模式,设计的一个简单实例, 你可以通过工具栏选择绘制不同图形,使用备份创建备忘录,然后选择恢复进行绘制图形的恢复。 http://blog.csdn.net/ziyuanxiazai123/article/details/12421265
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
NULL 博文链接:https://edwin492.iteye.com/blog/1124741
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 备忘录模式java demo
<!-- TOC --> - 23种设计模式 - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) ... - 备忘录模式(Memento) - 状态模式(S
主要介绍了设计模式中的Memento备忘录模式的在iOS App开发中的运用,Memento着重于捕获和具体化当前对象的内部状态,需要的朋友可以参考下
本文实例讲述了Python设计模式之备忘录模式原理与用法。分享给大家供大家参考,具体如下: 备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将...
主要介绍了php设计模式中的备忘录模式,使用php实现备忘录模式,感兴趣的小伙伴们可以参考一下
5.6 MEMENTO(备忘录)—对象行为型模式 188 5.7 OBSERVER(观察者)—对象行为型模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型模式 208 5.10 TEMPLATE METHOD(模板方法)—类...
主要介绍了Java设计模式之备忘录模式(Memento模式)介绍,memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态,需要的朋友可以参考下