- 浏览: 214424 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
teacodeing:
111
理解Java常量池 -
teacodeing:
122334455
理解Java常量池 -
最佳蜗牛:
有理有据,期待更多这样的文章。
理解Java常量池 -
ruijin5566:
cry615 写道zean 写道“在方法区中,而方法区是在JV ...
理解Java常量池 -
cry615:
zean 写道“在方法区中,而方法区是在JVM内存模型中的堆中 ...
理解Java常量池
一、 模式定义:
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存前的状态。
二、 模式解说
在程序运行过程中,某些对象的状态处在转换过程中,可能由于某种原因需要保存此时对象的状态,以便程序运行到某个特定阶段,需要恢复到对象之前处于某个点时的状态。如果使用一些公有接口让其它对象来得到对象的状态,便会暴露对象的实现细节。
三、 结构图
1) 备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2) 备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3) 备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查。
四、一个例子
这个例子是我从网上找到的,我觉得它比较形象,就拿过来直接用了。下面是这个例子的代码:
class WindowsSystem{
private String state;
public Memento createMemento(){ //创建系统备份
return new Memento(state);
}
public void restoreMemento(Memento m){ //恢复系统
this.state=m.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
System.out.println("当前系统处于"+this.state);
}
}
class Memento{
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
class User{
private Memento memento;
public Memento retrieveMemento() { //恢复系统
return this.memento;
}
public void saveMemento(Memento memento){ //保存系统
this.memento=memento;
}
}
public class Test{
public static void main(String[] args) {
WindowsSystem Winxp = new WindowsSystem(); //Winxp系统
User user = new User(); //某一用户
Winxp.setState("好的状态"); //Winxp处于好的运行状态
user.saveMemento(Winxp.createMemento()); //用户对系统进行备份,Winxp系统要产生备份文件
Winxp.setState("坏的状态"); //Winxp处于不好的运行状态
Winxp.restoreMemento(user.retrieveMemento()); //用户发恢复命令,系统进行恢复
System.out.println("当前系统处于"+Winxp.getState());
}
}
在本例中,WindowsSystem是发起人角色(Orignation),Memento是备忘录角色(Memento),User是备忘录管理角色(Caretaker)。Memento提供了两个接口(注意这里的接口,并不是java中的接口,它指的是可被外界调用的方法):一个是为WindowsSystem 类的宽接口,能够得到WindowsSystem放入Memento的state属性,代码见WindowsSystem的createMemento方法和restoreMemento方法,createMemento方法向Memento放入state属性,restoreMemento方法获得放入的state属性。另一个是为User类提供的窄接口,只能管理Memento而不能对它的内容进行任何操作(见User类)。
五、 优缺点
1) 保持封装边界 使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息。该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来,从而保持了封装边界。
2) 它简化了原发器 在其他的保持封装性的设计中,Originator负责保持客户请求过的内部状态版本。这就把所有存储管理的重任交给了Originator。让客户管理它们请求的状态将会简化Originator,并且使得客户工作结束时无需通知原发器。
3) 使用备忘录可能代价很高 如果原发器在生成备忘录时必须拷贝并存储大量的信息,或者客户非常频繁地创建备忘录和恢复原发器状态,可能会导致非常大的开销。除非封装和恢复Originator状态的开销不大,否则该模式可能并不合适。
4) 维护备忘录的潜在代价 管理器负责删除它所维护的备忘录。然而,管理器不知道备忘录中有多少个状态。因此当存储备忘录时,一个本来很小的管理器,可能会产生大量的存储开销。
六、 适用性
1)必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2)如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
七、参考
http://tech.it168.com/n/d/2007-05-20/200705201437328.shtml
http://www.cnblogs.com/John-zhaohui/archive/2007/08/20/862663.html
http://www.cppblog.com/converse/archive/2006/08/09/11063.html
http://java.ccidnet.com/art/3741/20030715/544777_1.html
http://blog.csdn.net/qutr/archive/2006/08/01/1007600.aspx
<script type="text/javascript"></script>
发表评论
-
设计模式学习笔记(二十二)—FlyWeight享元模式
2008-07-04 17:04 917一、FlyWeight模式定义: ... -
设计模式学习笔记(二十一)—Composite模式
2008-07-04 17:02 835今天开始学习Composite模式,首先让我们看一下它的定义: ... -
设计模式学习笔记(二十)—Visitor访问者模式
2008-07-04 17:01 867Visitor模式定义:表示一个作用于某对象结构中各元素的操作 ... -
设计模式学习笔记(十九)—Chain of Responsibility职责链模式
2008-07-04 17:00 858Chain of Responsibility模式定义:为了避 ... -
设计模式学习笔记(十八)—Mediator中介者模式
2008-07-04 16:58 895设计模式学习笔记(十八)—Mediator中介者模式一、 模式 ... -
设计模式学习笔记(十六)—Proxy模式
2008-07-04 16:53 1366一、 Proxy模式定义:为其他对象提供一种代理以控制这个对象 ... -
设计模式学习笔记(十五)—State模式
2008-07-04 16:51 1010一、 State模式定义:允许一个对象在其状态改变时,改变它的 ... -
设计模式学习笔记(十四)—Command模式
2008-07-04 16:49 875一、 Command模式定义:将一个请求封装为一个对象,从而使 ... -
设计模式学习笔记(十三)—Iterator迭代器模式
2008-07-04 16:48 627Iterator模式定义:提供一个方法顺序访问一个聚合对象的 ... -
设计模式学习笔记(十二)—Builder建造者模式
2008-07-04 16:47 871Builder模式定义:将一个复杂对象的构建与它的表示分离, ... -
设计模式学习笔记(十一)—Prototype原型模式
2008-07-04 16:45 1001Prototype模式的意图是: ... -
设计模式学习笔记(十)—Factory Method模式
2008-07-04 16:44 865《设计模式》一书对Factory Method模式是这样描述的 ... -
设计模式学习笔记(九)—Singleton模式
2008-07-04 16:43 863《设计模式》一书对Singleton模式是这样描述的:保证一个 ... -
设计模式学习笔记(八)—Template Method模式
2008-07-04 16:42 775《设计模式》一书对Temp ... -
设计模式学习笔记(七)—Observer观察者模式
2008-07-04 16:42 850《设计模式》一书对Observer是这样描述的:定义对象间的一 ... -
设计模式学习笔记(六)—Decorator装饰模式
2008-07-04 16:41 842《设计模式》一书对Decorator是这样描述的: 动态地给 ... -
设计模式学习笔记(五)—Abstract Factory抽象工厂模式
2008-07-04 16:38 821GOF《设计模式》一书对Abstract Factory模式是 ... -
设计模式学习笔记(四)—Bridge桥接模式
2008-07-04 16:36 858设计模式》一书对Bridge是这样描述的: 将抽象与其实现解耦 ... -
设计模式学习笔记(三)—-Strategy策略模式
2008-07-04 16:30 923GOF《设计模式》一书对Strategy模式是这样描述的: ... -
设计模式学习笔记(二)—-Adapter适配器模式
2008-07-04 16:27 780GOF《设计模式》一书对Adapter模式是这样描述的: ...
相关推荐
6. 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 7. 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的...
### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...
11. 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将该对象恢复到原先保存的状态。 以上为尚学堂300Java设计模式部分学习笔记中的重点...
它们包括:责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observable/Observer)、状态(State)、策略(Strategy)、模板方法...
如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、责任链模式(Chain of Responsibility)、命令模式(Command)、备忘录模式...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
- **备忘录模式**(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 - **观察者模式**(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,...
- **行为型模式**:如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、命令(Command)、责任链(Chain of Responsibility)、备忘录(Memento)、...
- 备忘录模式(Memento):在不破坏封装性的前提下,捕获对象的状态并恢复。 - 观察者模式(Observer):当对象状态改变时,通知所有依赖它的对象。 - 状态模式(State):允许对象在其内部状态改变时改变其行为...
例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...
- 行为型模式:如责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、状态(State)、策略(Strategy...
步步为营 .NET 设计模式学习笔记这个文件名暗示了文档可能采用逐步深入的方式,从基础概念开始,逐步引导读者理解每个模式的用途、实现方式以及在实际.NET项目中的应用。可能包含详细的代码示例,帮助读者通过实践来...
8. **备忘录模式(Memento)**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 9. **状态模式(State)**:允许对象在其内部状态改变时改变其行为。 10. **解释器模式...
行为型模式关注对象之间的交互和职责分配,包括责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observer)、...
### 设计模式学习笔记知识点概览 #### 一、引言 设计模式是软件工程领域中一种非常重要的概念,它代表了一种最佳实践的方式,帮助开发者解决特定问题时能够更加高效、灵活。良葛格的《Design Pattern学习笔记》不仅...
17. **备忘录模式(Memento)**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这使得以后可以恢复对象到先前的状态。 18. **状态模式(State)**:允许对象在其内部状态改变时...