设计模式学习笔记--备忘录(Mamento)模式
写在模式学习之前
什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式;每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式;当我们碰到模式所描写叙述的问题,就能够直接用对应的解决方法去解决问题,这就是设计模式。
设计模式就是抽象出来的东西。它不是学出来的,是用出来的;也许你根本不知道不论什么模式。不考虑不论什么模式。却写着最棒的代码,即使以“模式专家”的角度来看,都是最佳的设计。不得不说是“最佳的模式实践”。这是由于你积累了非常多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。
有人说:“水平没到,学也白学,水平到了,无师自通”。
诚然,模式背熟,依旧可能写不出好代码。更别说设计出好框架。OOP理解及实践经验到达一定水平。同一时候也意味着总结了非常多好的设计经验。但"无师自通",却也未必尽然。或者能够说,恰恰是在水平和经验的基础上,到了该系统的学习一下“模式”的时候了。学习一下专家总结的结果。印证一下自己的不足,对于提高水平还是非常有帮助的。
本系列的设计模式学习笔记,实际是对于《Java与模式》这本书的学习记录。
备忘录模式的定义
备忘录模式(Memento Pattern),又叫快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。
备忘录对象是一个用来存储还有一个对象内部状态的快照的对象。
备忘录模式的用意,是在不破坏封装(enscapsolution)的条件下。将还有一个对象的状态捕捉(capture)住,并外部(Externalize)化。存储起来,从来能够在将来合适的时候,把这个对象还原到存储起来的状态。
备忘录模式的结构
结构图
所涉及的角色
(1)备忘录(Memento)角色:将发起人(Originator)角色的内部状态存储起来,能够保护其状态不被发起人对象之外的不论什么对象读取。
(2)发起人(Originator)角色:创建一个含有当前内部状态的备忘录对象,使用备忘录对象存储其内部状态;
(3)负责人(Caretaker)角色:负责保存备忘录对象。不检查备忘录对象的内容。
从以上的职责能够看出。负载人(Caretaker)角色,不过把备忘录(Memento)角色存储起来。功能微小而单一,所以非常多时候,其功能也被集成到发起人(Originator)角色中。形成一种备忘录模式的变种,“自述历史”模式,这可能是备忘录模式的最流行的实现了。
记住这些模式的名字可真是麻烦,非常多时候,我们可能已经在须要快照的编程场景中使用过这样的模式了,但是。真的不知道是备忘录模式。是“自述历史”
代码实现
public class MementoTest {
public static void main(String[] args)
{
Originator o = new Originator();
Caretaker c = new Caretaker();
o.setState("On"); //更改发起人状态为On
System.out.println("Current State : " + o.getState());
c.setMemento(o.createMemento()); //存储快照
o.setState("Off"); //更改发起人状态为Off
System.out.println("Current State : " + o.getState());
o.restoreMemento(c.getMemento()); //从快照恢复状态
System.out.println("Current State : " + o.getState());
}
}
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 Originator
{
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;
}
}
class Caretaker{
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
备忘录模式的优缺点
长处:
(1)有时一些发起人对象的状态信息必须保存在发起人对象以外的地方。可是必须由发起人对象自己读取。
这时备忘录能够把发起人对象内部信息对其它对象屏蔽起来,从而能够恰当的保持封装的边界。
长处&缺点:
这个模式,简化了发起人(Originator)类;当然同一时候添加了备忘录(Memento)类和负责人(Caretaker)类。这算长处还是缺点呢?
仅仅能是我们依据详细的场景。依据实际情况进行选择。
备忘录模式的适用场景
(1)对无状态Http协议的支持技术。比方session、cookie;
(2)一些视窗软件的配置文件。关闭时保存状态,重新启动打开时自己主动到达关闭时的状态。
设计模式学习笔记--备忘录(Mamento)模式的更多相关文章
- 设计模式学习笔记-Adapter模式
Adapter模式,就是适配器模式,使两个原本没有关联的类结合一起使用. 平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类 ...
- Java-马士兵设计模式学习笔记-装饰者模式
Java装饰者模式简介 一.假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下: 1.Worker.java p ...
- 研磨设计模式学习笔记2--外观模式Facade
需求:客户端需要按照需求,执行一个操作,操作包括一个系统中的3个模块(根据配置选择是否全部执行). 外观模式优点: 客户端无需知道系统内部实现,,只需要写好配置文件,控制那些模块执行,简单易用. 外观 ...
- 设计模式学习笔记 1.factory 模式
Factory 模式 用户不关心工厂的具体类型,只知道这是一个工厂就行. 通过工厂的实现推迟到子类里面去来确定工厂的具体类型. 工厂的具体类型来确定生产的具体产品. 同时用户不关心这是一个什么样子的产 ...
- 设计模式学习笔记——Composite 组合模式
用于描述无限层级的复杂对象,类似于描述资源管理器,抽象出每一个层级的共同特点(文件夹和文件,展开事件) 以前描述一个对象,是将整个对象的全部数据都描述清楚,而组合模式通过在对象中定义自己,描述自己的下 ...
- 设计模式学习笔记——Bridge 桥接模式
先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让mod ...
- 设计模式学习笔记——Visitor 访问者模式
1.定义IVisitor接口,确定变化所涉及的方法 2.封装变化类.实现IVisitor接口 3.在实体类的变化方法中传入IVisitor接口,由接口确定使用哪一种变化来实现(封装变化) 4.在使用时 ...
- Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能
一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...
- Java-马士兵设计模式学习笔记-责任链模式-处理数据
一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...
随机推荐
- 【C++】嵌套类、友元
黄邦勇帅 里面关于嵌套类的介绍我有疑惑.里面11.9说在创建一个外围类的对象时先执行嵌套类的构造函数然后再执行外围类的构造函数,析构函数则以相反的方式执行. 可是我编程实验了一下,创建外围类对象时并不 ...
- DELPHI用const来提高应用程序在多核多线程下的性能
来自:http://bbs.csdn.net/topics/330048800 --------------------------------------------------------- 我们 ...
- Selenium2+python自动化65-js定位几种方法总结【转载】
前言 本篇总结了几种js常用的定位元素方法,并用js点击按钮,对input输入框输入文本 一.以下总结了5种js定位的方法 除了id是定位到的是单个element元素对象,其它的都是elements返 ...
- 使用bottle进行web开发(5):Generating Content
在纯粹的 WSGI中,你的应用能返回的数据类型是十分有限的,你必须返回可迭代的字符串,你能返回字符串是因为字符串是可以迭代的,但是这导致服务器将你的内容按一字符一字符的传送,这个时候,Unicode ...
- MyEclipse10.7安装反编译插件
jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,下面像大家介绍下如何将jadclipse加入到MyEclipse10.X,9.X,8.X当中: htt ...
- KISSY - A Powerful JavaScript Framework
KISSY 是一款跨终端.模块化.高性能.使用简单的 JavaScript 框架.除了完备的工具集合如 DOM.Event.Ajax.Anim 等,它还提供了经典的面向对象.动态加载.性能优化解决方案 ...
- A - Enterprising Escape 【BFS+优先队列+map】
The Enterprise is surrounded by Klingons! Find the escape route that has the quickest exit time, and ...
- golang笔记:cookie
在同一个问题上栽了两次,以后碰到cookie出问题多半都是因为这个. Request.Cookie(name)取Cookie的时候,返回值只有name和value cookie.go cookies ...
- 主席树【bzoj3524(p3567)】[POI2014]Couriers
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0 ...
- 洛谷——P2421 A-B数对(增强版)
题目背景 woshiren在洛谷刷题,感觉第一题:求两数的和(A+B Problem)太无聊了,于是增加了一题:A-B Problem,难倒了一群小朋友,哈哈. 题目描述 给出N 个从小到大排好序的整 ...