目录

文章目录

  • 目录
  • 备忘录模式
  • 应用场景
  • 代码示例

备忘录模式

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

简单来说,就是在运行过程中我们可以记录某个状态,当遇到错误时恢复当前状态,这在业务流程中是用设计来处理异常情况。

优点

  • 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取。这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
  • 本模式简化了发起人。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。
  • 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

缺点

  • 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
  • 当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
  • 当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。

应用场景

代码示例

实体角色:

  1. Originator(发起人):负责创建一个 Memento(备忘录),用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator 可以根据需要决定 Memento 存储自己的哪些内部状态。

  2. Memento(备忘录):负责存储 Originator 对象的内部状态,并可以防止 Originator 以外的其他对象访问备忘录。备忘录有两个接口:

    1. Caretaker 只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。
    2. Originator 却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
  3. Caretaker(管理者):负责 Memento,不能对 Memento 的内容进行访问或者操作。

class AddNumber:def __init__(self):self.start = 1def add(self, number):self.start += numberprint(self.start)class Memento:"""备忘录"""def backups(self, obj=None):"""设置备份方法:param obj: :return: """self.obj_dict = copy.deepcopy(obj.__dict__)print("备份数据:{}".format(self.obj_dict))def recovery(self, obj):"""恢复备份方法:param obj: :return: """obj.__dict__.clear()obj.__dict__.update(self.obj_dict)return objif __name__ == '__main__':test = AddNumber()memento = Memento()for i in [1, 2, 3, 'n', 4]:if i == 2:memento.backups(test)try:test.add(i)except TypeError as e:print(e)print(test.start)memento.recovery(test)print(test.start)

设计模式 — 行为型模式 — 备忘录模式相关推荐

  1. Java设计模式之行为型:备忘录模式

    在开发过程中,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,在编程时假如编写失误,例如不小心误删除了几行代码,我们希望返回删除前的状态,便可以使用 Ctrl+Z 来进行返回,这时 ...

  2. 《设计模式详解》行为型模式 - 备忘录模式

    备忘录模式 6.10 备忘录模式 6.10.1 概述 6.10.2 结构 6.10.3 案例实现 "白箱" 备忘录模式 "黑箱" 备忘录模式 6.10.4 优缺 ...

  3. 设计模式 行为型模式 -- 备忘录模式 具体实例:游戏挑战BOSS

    01:设计模式 行为型模式 – 备忘录模式(定义.结构.优缺点 适用场景分析) 02:设计模式 行为型模式 – 备忘录模式 具体实例:游戏挑战BOSS 03:设计模式 行为型模式 实例 – 备忘录模式 ...

  4. 设计模式学习笔记--Memento 备忘录模式

    在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现.      如何实现 ...

  5. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  6. 行为模式(模板模式命令模式备忘录模式)

    目录 模板方法模式(Template) 介绍 实现 命令模式(Command) 介绍 实现 备忘录模式(Memento) 介绍 实现 模板方法模式(Template) 一个抽象类公开定义了执行它的方法 ...

  7. 设计模式学习笔记:备忘录模式(Memento)

    文章目录 一.备忘录模式简介 二.适应场景 三.示例演示 四.测试示例 拥有乐观的心态很重要,它能让工作和生活更加美好. 一.备忘录模式简介 备忘录模式是设计模式中行为型模式的一种.备忘录模式用于保存 ...

  8. 设计模式中介者模式-备忘录模式-状态模式

    设计模式 中介者模式 基本介绍 中介者模式使用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式属于行为模式,使 ...

  9. 行为型模式——备忘录模式(Memento Pattern)

    文章目录 备忘录模式(Memento Pattern) 什么是备忘录模式? UML 角色 应用 使用模板 为什么要使用备忘录模式? 优点: 缺点: 怎样使用备忘录模式? 在JDK中的使用 备忘录模式( ...

最新文章

  1. 优达学城《DeepLearning》大纲和学习愿景
  2. 多重集表示合json数据_计数DP(划分数,多重集组合数)
  3. 区块链技术沙龙最全回顾:我们需要做怎样的区块链?
  4. 算法:字符串消除问题的数学证明
  5. Vue中实现数据列表无缝轮播
  6. 【java】反射+poi 导出excel
  7. 银行大数据风控平台的建设要点与应用
  8. JAVA高性能内存队列-disruptor
  9. 支持MYSQL的DNS服务器的搭建
  10. 实对称矩阵的特征值求法_线性代数中的二次型,实际上是特征值的几何应用,概念需加强理解...
  11. spearman相关系数 matlab,数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)...
  12. 耗时两周,纯手敲python入门级基础笔记
  13. 胖客户端、瘦客户端与智能客户端
  14. 智能推荐系统开发中的十大要素
  15. ecshop模板支持php,解决ecshop模板不支持php代码,修改ecshop过滤模板php代码!
  16. UE4新手引导之下载和安装虚幻4游戏引擎
  17. 【pytorch】ResNet18、ResNet20、ResNet34、ResNet50网络结构与实现
  18. Navicat for MySQL 12破解
  19. Java实现一个订餐外卖系统
  20. 简单几行命令让pip升级

热门文章

  1. 使用Kali官网提供的虚拟机系统
  2. Kali Linux发布2020.1a版本
  3. Visual Studio 2019更新到16.1.6
  4. NMAP分布式扫描工具dnmap
  5. iOS 9应用开发教程之使用代码添加按钮美化按钮
  6. springboot 中文文档_比Swagger还好用的自动生成接口文档工具
  7. C# json解析字符串总是多出双引号_在JavaScript应用中将CSV转换为JSON
  8. c 判断文件是否存在_C语言编程之怎样判断某一文件是否存在
  9. layui fixbar 返回顶部_FANUC 数控系统机床返回参考点功能的应用研究
  10. 放张载玻片就能放大一万倍,普通光学显微镜都馋哭了 | Nature子刊