备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

介绍

意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

如何解决:通过一个备忘录类专门存储对象状态。

关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。

优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。

实现

备忘录模式使用三个类 MementoOriginator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。

MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。

步骤 1

创建 Memento 类。

public class Memento {private String state;public Memento(String state){this.state = state;}public String getState(){return state;}
}

步骤 2

创建 Originator 类。

public class Originator {private String state;public void setState(String state){this.state = state;}public String getState(){return state;}public Memento saveStateToMemento(){return new Memento(state);}public void getStateFromMemento(Memento Memento){state = Memento.getState();}
}

步骤 3

创建 CareTaker 类。

import java.util.ArrayList;
import java.util.List;public class CareTaker {private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento state){mementoList.add(state);}public Memento get(int index){return mementoList.get(index);}
}

步骤 4

使用 CareTaker 和 Originator 对象。

public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();CareTaker careTaker = new CareTaker();originator.setState("State #1");originator.setState("State #2");careTaker.add(originator.saveStateToMemento());originator.setState("State #3");careTaker.add(originator.saveStateToMemento());originator.setState("State #4");System.out.println("Current State: " + originator.getState());        originator.getStateFromMemento(careTaker.get(0));System.out.println("First saved State: " + originator.getState());originator.getStateFromMemento(careTaker.get(1));System.out.println("Second saved State: " + originator.getState());}
}

步骤 5

验证输出。

Current State: State #4
First saved State: State #2
Second saved State: State #3

【设计模式】备忘录模式相关推荐

  1. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  2. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  3. Java设计模式——备忘录模式

    Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...

  4. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  5. C++设计模式——备忘录模式(memento pattern)

    博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...

  6. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  7. 大话设计模式—备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保 ...

  8. PHP设计模式——备忘录模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  9. 一天一个设计模式---备忘录模式

    介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将对象恢复到原先保存的状态. 场景:我们在平时玩单机游戏的时候,比如红白机的Pokemon–宠物小精灵, ...

  10. golang设计模式——备忘录模式

    备忘录模式 当初学备忘录模式的时候,特别开心.这不就是游戏里的备份嘛!游戏关闭之后,重新开启,从上次结束的位置继续开始.但终归没有进入游戏行业,也没有机会用过备忘录模式. 备忘录模式:在不破坏封装性的 ...

最新文章

  1. VDI序曲二十四 APP-V客户端安装及虚拟应用程序体验
  2. linux内核中等待队列
  3. Vue指令之v-model和双向数据绑定
  4. Spring AOP中的前置通知和后置通知详解
  5. kafka分区分配策略
  6. Arcgis利用点数据集(txt数据)转为shp线数据(含案例)
  7. sql server managerment 给表加说明
  8. php foreach、while性能比较
  9. 5.8Ghz微波雷达感应技术,智能雷达传感器,人体感应技术方案
  10. TCP通信丢包原因总结
  11. Rayson API 框架分析系列之7: 注解处理器(APT)原理
  12. c软件查表获得电量代码_energy.c 源代码在线查看 - 基于单片机的多费率电能表源程序 资源下载 虫虫电子下载站...
  13. 1分钟彻底搞懂关于nginx的proxy_pass
  14. 理科爱好者杂志理科爱好者杂志社理科爱好者编辑部2022年第3期目录
  15. mysql数据库用sql语句在指定的一个字段后面添加一个字段
  16. mysql中mvcc解决不可重复读
  17. 【抓包工具】配置:Fiddler 配置手机/平板抓包 https
  18. wireshark解析信令tshark
  19. 重构26-Remove Double Negative(去掉双重否定)
  20. 模板模式--servlet模板模式的应用

热门文章

  1. SEGGER RTT STOP/SLEEP 模式下使用
  2. unix系统编程小结(二)------文件和目录
  3. 保护物联网的数据隐私和在线安全的7种方式
  4. Oh-My-Zsh及主题、插件安装与配置
  5. 自己总结的安装zabbix
  6. 《响应式Web设计:HTML5和CSS3实践指南》——2.9节基于位置伪类的交替行样式
  7. ECMA_作用域深入This关键字
  8. KVC(forKey,forKeyPath)
  9. UVa572 Oil Deposits DFS求连通块
  10. 程序员如何才能提高自己?通过一次重构代码讲解自己的感受【有代码比较】...