文章目录

  • 一、设计模式的定义
  • 二、优缺点
    • 2.1、优点:
    • 2.2、缺点:
  • 三、备忘录模式的角色和UML类图
    • 3.1、角色如下:
    • 3.2、UML类图
  • 四、游戏角色攻击力备份的示例
    • 4.1、代码:
      • 4.1.1、Originator:发起人
      • 4.1.2、Memento: 备忘录
      • 4.1.3、Caretaker :管理者
      • 4.1.4、Client
      • 4.1.5、运行结果:
  • 五、QQ信息备份的示例
    • 5.1、代码:
      • 5.1.1、OriginatorForUserInfo:用户信息类(发起人)
      • 5.1.2、Memento: 备忘录
      • 5.1.3、Caretaker:负责人
      • 5.1.4、Client
      • 5.1.4、运行结果:

很多应用软件都备份、恢复的功能,如 Word、记事本等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;

还有在 IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。

通俗来讲,备忘录 就是备份,备份到当前对象之外,当需要可以从外部引入,从而恢复当初的状态。

备忘录模式 就是 记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。

一、设计模式的定义

设计模式是 在不破坏封装性的前提下,将对象当前的内部状态保存在对象之外,以便以后当需要时能将该对象恢复到原先保存的状态。

备忘录模式又叫快照模式,是一种对象行为型模式。

二、优缺点

2.1、优点:

  • 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  • 实现了内部状态的封装。除了创建它的发起类之外,其他对象都不能够访问这些状态信息。
  • 简化了发起类。发起类不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

2.2、缺点:

资源消耗大。

如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

三、备忘录模式的角色和UML类图

3.1、角色如下:

  1. Originator(发起人):``发起人可以创建一个Memento,并存储它的当前状态,也可以使用Memento` 来恢复其内部状态。

    发起人 就是 被备份的对象, 备份的是Originator内部的部分数据,而不是整 个对象)。

  2. Memento (备忘录):备份的最小单元。备忘录对象不能直接被其他类使用,根据 Originator 来决定保存哪些内部状态。

  3. Caretaker(管理者、负责人):对 Memento 进行管理,保存一个或多个备忘录对象,提供获取 Memento 的功能,但不能对 Memento 的进行访问与修改。

3.2、UML类图

四、游戏角色攻击力备份的示例

游戏角色具有攻击力,战斗前保存自身的状态(攻击力),当战斗力下降时,从备忘录对象中恢复到大战之前的状态。

4.1、代码:

4.1.1、Originator:发起人

/*** 发起人*/
public class Originator {/** 状态信息 */private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}/*** 创建一个可以保存状态的Memento对象* * @return*/public Memento createMemento() {return new Memento(state);}/*** 通过备忘录对象,恢复状态* @param memento*/public void getMemento(Memento memento) {state = memento.getState();}
}

4.1.2、Memento: 备忘录

/*** 备忘录*/
public class Memento {private String state;//构造器public Memento(String state) {super();this.state = state;}public String getState() {return state;}
}

4.1.3、Caretaker :管理者

/*** 管理者* <pre>* 对备忘录进行管理* </pre>*/
public class Caretaker {//在List 集合中会有很多的备忘录对象private List<Memento> mementoList = new ArrayList<Memento>();public void save(Memento memento) {mementoList.add(memento);}//获取到第index个Originator 的备忘录对象(即保存状态)public Memento get(int index) {return mementoList.get(index);}
}

4.1.4、Client

public class Client {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("状态#1 攻击力 100");//保存了当前的状态caretaker.save(originator.createMemento());originator.setState("状态#2 攻击力 80");caretaker.save(originator.createMemento());        originator.setState("状态#3 攻击力 50");caretaker.save(originator.createMemento());        System.out.println("当前的状态是  " + originator.getState());//希望得到状态 1, 将 originator 恢复到状态1originator.getMemento(caretaker.get(0));System.out.println("恢复到状态1 , 当前的状态是");System.out.println("当前的状态是  " + originator.getState());}
}

4.1.5、运行结果:

当前的状态是  状态#3 攻击力 50
恢复到状态1 , 当前的状态是
当前的状态是  状态#1 攻击力 100

五、QQ信息备份的示例

对QQ信息进行备份,起初时,QQ的昵称是奋斗、昵称是周杰伦的头像,

后来改为QQ的昵称是鹿娘娘、昵称是李现的头像,

每次修改前要备份上一次的状态,可以随时恢复某一时刻的状态。

5.1、代码:

5.1.1、OriginatorForUserInfo:用户信息类(发起人)

/*** QQ信息(发起人)*/
public class OriginatorForUserInfo {/** QQ号码 */private String qqNumber;/** 昵称  */private String nickname;/** 头像照片 */private String pic;public String getQqNumber() {return qqNumber;}public void setQqNumber(String qqNumber) {this.qqNumber = qqNumber;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}/*** 保存备忘录* * @return 返回一个新的备忘录对象*/public Memento createMemento() {return new Memento(nickname, pic);}/*** 恢复备忘录对象*/public void restoreMemento(Memento memento) {this.nickname = memento.getNickname();this.pic = memento.getPic();}/*** 显示用户信息*/public void show() {System.out.println("qqNumber:" + qqNumber);System.out.println("nickname:" + nickname);System.out.println("pic:" + pic);}
}

5.1.2、Memento: 备忘录

/*** 备忘录*/
public class Memento {/** 昵称 */private String nickname;/** 头像照片 */private String pic;private Memento() {}public Memento(String nickname, String pic) {super();this.nickname = nickname;this.pic = pic;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}
}

5.1.3、Caretaker:负责人

/*** 负责人*/
public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void saveMemento(Memento memento) {this.memento = memento;}
}

5.1.4、Client

/*** 测试类*/
public class Client {public static void main(String[] args) {// 原发人OriginatorForUserInfo originator = new OriginatorForUserInfo();// 负责人Caretaker caretaker = new Caretaker();originator.setQqNumber("11111");originator.setNickname("123456");originator.setPic("周杰伦的头像");show(originator, "初始状态");// 保存状态caretaker.saveMemento(originator.createMemento());// 修改昵称、电头像照片originator.setNickname("654321");originator.setPic("李现的头像");show(originator, "修改状态后");// 恢复状态一originator.restoreMemento(caretaker.getMemento());show(originator, "恢复到初始状态后");}private static void show(OriginatorForUserInfo originator, String status) {System.out.println(status + ":");originator.show();System.out.println("==========================");}
}

5.1.4、运行结果:

初始状态:
qqNumber:11111
nickname:奋斗
pic:周杰伦的头像
==========================
修改状态后:
qqNumber:11111
nickname:鹿娘娘
pic:李现的头像
==========================
恢复到初始状态后:
qqNumber:11111
nickname:奋斗
pic:周杰伦的头像
==========================

设计模式之备忘录模式(Memento Pattern)相关推荐

  1. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类 ...

  2. java memento_备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  3. 保留状态的秘密 - 深入了解Java备忘录模式(Memento Pattern)

    文章目录 一.概述 1.1 介绍备忘录模式的定义和作用 二.角色 2.1 介绍备忘录模式中的三个角色 三.实现方法 3.1 介绍备忘录模式的实现方法 3.2 分别介绍基于类和基于接口实现备忘录模式的方 ...

  4. Net设计模式实例之备忘录模式(Memento Pattern)

    一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...

  5. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

    23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...

  7. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]----------by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

  8. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic;namespace ConsoleApplication6 {/// <summary>/// ...

  9. 38备忘录模式(Memento Pattern)

    对象状态的回溯:     对象状态的变化无端,如何回溯/恢复对象在某个点的状态?                          动机:     在软件构建过程中,某些对象的状态在转换过程中,可能由 ...

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

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

最新文章

  1. 临时表,临时表什么时候删除
  2. 为何把日志打印到控制台很慢?
  3. 题目1009:二叉搜索树
  4. 【Unity笔记】使用协程(Coroutine)异步加载场景
  5. Python时间库—datetime的详解及使用
  6. V神:区块链跨链技术大规模应用将在一到两年内爆发
  7. P2490-[SDOI2011]黑白棋【博弈论,dp】
  8. Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建
  9. python-socket2
  10. HDU 2256Problem of Precision(矩阵快速幂)
  11. leetcode 877 stone game
  12. php 检测字符长度,php验证字符串长度问题
  13. 74 系列COMS系列逻辑器件芯片功能大全
  14. 中级软件设计师知识点总结
  15. oracle 中dummy,layout设计中dummy的作用详解(上图。好贴好贴,讲的很仔细)
  16. 什么是Subscript?
  17. 有关“A New Adversarial Embedding Method for Enhancing Image Steganography“的理解
  18. Banner轮播图的基本使用
  19. ABP理论学习之本地化
  20. 利用Grafana为你的Loki添加告警

热门文章

  1. 哪些 iOS 应用让你用了很满意并能提高生活质量?
  2. Pandas的常用操作(一)
  3. shell编程实例练习
  4. python的简单使用_用python简单处理图片
  5. java 生成二维码可带LOGO和文字描述
  6. 【Python打卡2019】20190417之计算BMR
  7. 戴尔电脑无法启动,显示致命错误C00000D4正在应用更新操作
  8. 计算机英语上海答案,上海居转户 计算机或英语职称证书
  9. 比例导引 matlab,比例导引法Matlab仿真.docx
  10. 初学Linux对开机启动流程的相关实验