- 浏览: 102580 次
- 性别:
- 来自: 深圳
文章分类
最新评论
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 1116State模式也叫状态模式,是由GoF提出的23种软件设计模式 ... -
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1385Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1478Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1599Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1432Observer模式也叫观察者 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1144Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Iterator - 迭代模式
2010-12-18 16:27 1194Iterator模式也叫迭代模式,是由GoF提出的23种设 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 1028Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 912Command(CoR)模式也叫命 ... -
设计模式之 Chain of Responsibility - 职责链模式
2010-12-18 16:18 1229Chain of Responsibility(CoR)模 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1084Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Flyweight - 享元模式
2010-12-16 23:42 1076Flyweight模式也叫享元模式,是由GoF提出的23种 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 1034Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 883Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 833装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1489Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1041Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 945Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1161Prototype模式也叫原型模式,是由GoF提出的23种设计 ... -
设计模式之 Builder - 建造者模式
2010-11-18 23:51 1090Builder模式也叫建造者模式或者生成器模式,是由GoF ...
相关推荐
备忘录模式是一种在软件工程中广泛使用的面向对象设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。这个模式的名字来源于我们日常生活中使用的备忘录,它记录了一些重要的信息,当需要...
**Java设计模式——备忘录模式详解** 备忘录模式是一种行为设计模式,它允许对象在不破坏封装性的前提下捕获并存储其内部状态,以便稍后恢复到该状态。这种模式常用于在游戏中保存进度、撤销/重做操作、以及在复杂...
备忘录模式是一种在不破坏封装性的前提下,捕获一个对象的状态,并允许在未来的某个时刻恢复这个状态的设计模式。这种模式在很多场景下都非常有用,例如在游戏中保存进度、在编辑器中撤销/重做操作等。备忘录模式的...
备忘录模式是一种在软件工程中广泛使用的面向对象设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。备忘录模式的核心思想是封装对象的状态,将其保存到一个独立的对象(备忘录)中,而...
备忘录模式是一种常用的设计模式,它在软件工程中用于保存对象的状态,以便在需要时恢复到之前的状态。这种模式的主要目标是实现数据的安全存储,同时保持对象的封装性,避免对外部对象直接访问其内部状态。在iOS...
在实际开发中,备忘录模式可以与其他设计模式结合使用,如工厂模式用于创建备忘录对象,装饰器模式用于扩展备忘录的功能等。同时,需要注意的是,过度使用备忘录模式可能会导致内存消耗增加,因此在实现时需要权衡...
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到先前的状态。这种模式在需要撤销/重做功能、...
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。该模式通常用于需要撤销操作或恢复先前状态的情况下。备忘录模式包括三个主要组件:原始对象、备忘录...
c++设计模式-行为型模式-备忘录模式;qt工程;c++简单源码;备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先...
备忘录模式(Memento Pattern)是软件设计模式中的一种行为模式,它的主要目的是在不破坏对象封装性的前提下,允许对象在特定时刻保存其内部状态,并能够在之后恢复到保存时的状态。这种模式广泛应用于撤销/重做功能...
Java设计模式中的备忘录模式(Memento Pattern)是一种用于保存对象状态的模式,以便在未来某一时刻能够恢复到之前的状态。这种模式的核心在于在不违反对象封装性的前提下,捕获对象的内部状态并将其存储起来。备忘...
备忘录模式(Memento Pattern)是设计模式中的一种行为模式,主要目的是在不违反封装原则的情况下,保存一个对象的内部状态,以便在需要时能够恢复到先前的状态。这种模式通常用于实现撤销/重做功能或者在游戏中保存...
备忘录(Memento)模式是一种行为设计模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并允许该对象在以后恢复到这个状态。这种模式常用于需要保存和恢复对象状态的情景,例如撤销/重做功能、游戏存档或...
备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。这种模式通常用于游戏存档、撤销/重做操作、以及...
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。在C++中实现备忘录模式通常涉及以下几个角色: 1. 发起人(Originator):创建一个备忘录,用以...
备忘录模式(Memento Pattern)是软件设计模式中的一种,属于行为模式。它提供了一种方式来恢复对象到之前的状态,即“撤销”操作。备忘录模式的核心思想是保存对象的内部状态,以便在需要时能恢复到这个状态,而...
这是运用Memento设计模式,设计的一个简单实例, 你可以通过工具栏选择绘制不同图形,使用备份创建备忘录,然后选择恢复进行绘制图形的恢复。 http://blog.csdn.net/ziyuanxiazai123/article/details/12421265
备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。这种模式常用于需要记录用户操作历史或者游戏进度...