写在模式学习之前

什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式;每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式;当我们碰到模式所描写叙述的问题,就能够直接用对应的解决方法去解决问题,这就是设计模式。

设计模式就是抽象出来的东西。它不是学出来的,是用出来的;也许你根本不知道不论什么模式。不考虑不论什么模式。却写着最棒的代码,即使以“模式专家”的角度来看,都是最佳的设计。不得不说是“最佳的模式实践”。这是由于你积累了非常多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。

有人说:“水平没到,学也白学,水平到了,无师自通”。

诚然,模式背熟,依旧可能写不出好代码。更别说设计出好框架。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)模式的更多相关文章

  1. 设计模式学习笔记-Adapter模式

    Adapter模式,就是适配器模式,使两个原本没有关联的类结合一起使用. 平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类 ...

  2. Java-马士兵设计模式学习笔记-装饰者模式

    Java装饰者模式简介 一.假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下: 1.Worker.java p ...

  3. 研磨设计模式学习笔记2--外观模式Facade

    需求:客户端需要按照需求,执行一个操作,操作包括一个系统中的3个模块(根据配置选择是否全部执行). 外观模式优点: 客户端无需知道系统内部实现,,只需要写好配置文件,控制那些模块执行,简单易用. 外观 ...

  4. 设计模式学习笔记 1.factory 模式

    Factory 模式 用户不关心工厂的具体类型,只知道这是一个工厂就行. 通过工厂的实现推迟到子类里面去来确定工厂的具体类型. 工厂的具体类型来确定生产的具体产品. 同时用户不关心这是一个什么样子的产 ...

  5. 设计模式学习笔记——Composite 组合模式

    用于描述无限层级的复杂对象,类似于描述资源管理器,抽象出每一个层级的共同特点(文件夹和文件,展开事件) 以前描述一个对象,是将整个对象的全部数据都描述清楚,而组合模式通过在对象中定义自己,描述自己的下 ...

  6. 设计模式学习笔记——Bridge 桥接模式

    先说一下我以前对桥接模式的理解:当每个类中都使用到了同样的属性或方法时,应该将他们单独抽象出来,变成这些类的属性和方法(避免重复造轮子),当时的感觉是和三层模型中的model有点单相似,也就是让mod ...

  7. 设计模式学习笔记——Visitor 访问者模式

    1.定义IVisitor接口,确定变化所涉及的方法 2.封装变化类.实现IVisitor接口 3.在实体类的变化方法中传入IVisitor接口,由接口确定使用哪一种变化来实现(封装变化) 4.在使用时 ...

  8. Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能

    一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...

  9. Java-马士兵设计模式学习笔记-责任链模式-处理数据

    一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...

随机推荐

  1. 剑指offer 面试题5 : 从尾到头打印链表

    题目: 输入一个链表的头结点,从尾到头反过来打印出每个节点的值.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 思路: 通常 ...

  2. Servlet 调用过程

    上图的大概意思: 前台输入访问路径后,浏览器会去访问本地的host文件查询有木有与之匹配域名的IP地址,若无则在访问DNS服务器查询与之匹配的IP地址.解析IP后则开始发起HTTP请求,根据请求中的基 ...

  3. 洛谷 P1577 切绳子【二分答案】

    题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位. 输入输出格式 输入格式: 第一行两个整数N和K,接下来N行,描 ...

  4. HDU 2829 Lawrence

    $dp$,斜率优化. 设$dp[i][j]$表示前$i$个数字切了$j$次的最小代价.$dp[i][j]=dp[k][j-1]+p[k+1][i]$.观察状态转移方程,可以发现是一列一列推导出来的.可 ...

  5. Linux命令之file

    file [选项] [文件名] 确认文件类型 (1).常用选项 magic file指的是哪些具有特殊文件格式的文件 -b,--brief 不列出文件名称 -c,--checking-printout ...

  6. 7、Flask实战第7天:Jinjia2模板

    Jinja2模板介绍和查找路径 在前面的章节中,视图只是直接返回文本,然而在实际生产环境中其实很少这样用,因为实际的页面大多带有样式和复杂逻辑的HTML代码,这可以让浏览器其渲染出非常漂亮的页面. 我 ...

  7. 4、Django实战第4天:xadmin快速搭建后台管理系统

    Django默认为我们提供了后台管理系统admin, urls.py中配置的第一条就是访问后台管理系统admin的 urlpatterns = [ url(r'^admin/', admin.site ...

  8. Gitlab运维

    安装Gitlab 新建 /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=gitlab-ce baseurl=http://mirrors.tuna.t ...

  9. python基础-文件处理与函数

    1. 文件处理 1.1 文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 1.2 文件读取模式r r文本模式的读,在文件不存在,不会创建新文件 f = ...

  10. iOS使用CoreData实现收藏功能

    一般做收藏都是使用数据库或者归档,使用CoreData实现收藏功能就是没事时练一下,实现大概和数据库差不多. 首先创建一个工具类继承NSObject,在里面实现所需要的方法. 工具类的.h文件: ty ...