备忘录模式 详解

定义

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

行为型模式

角色

  • 发起人角色(Originator):记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据;
  • 备忘录角色(Memento):负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态;
  • 管理者角色(Caretaker):对备忘录 进行管理,保存和提供备忘录;

从网上找到的例图
enter image description here


适用场景

  • 需要保存一个对象在某一个时刻的状态或者部分状态;
  • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态;

例子

  • 这个就像你写代码,当你不小心删除了几行代码,这个时候你只需要command + z 就可以返回,这就像备忘录模式,系统帮你保存之前的状态;

实现代码

/*** Created by George on 16/7/16.*/
// 发起角色
var Originator = function () {this.getState = function () {return this.state;};this.setState = function (state) {this.state = state;};this.createMemento = function () {return new Memento(this.state);};this.restoreMemento = function (memento) {this.setState(memento.getState());};
};// 备忘录
var Memento = function (state) {this.state = state;this.getState = function () {return this.state;};this.setState = function (state) {this.state = state;};
};// 负责人角色
var Caretaker = function () {this.memento = null;this.getMemento = function () {return this.memento;};this.setMemento = function (memento) {this.memento = memento;};
};var originator = new Originator();
originator.setState("状态1 ");
console.log("初始状态 " + originator.getState());var caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.setState("状态2 ");console.log("改变后状态 " + originator.getState());originator.restoreMemento(caretaker.getMemento());console.log("恢复状态 " + originator.getState());

实现结果:
这里写图片描述


优缺点

  1. 当发起人角色中的状态改变的时候,可以还原到之前的状态;
  2. 备份的状态是保存在发起人角色之外的,这样发起人角色就不需要对各个备份的状态进行管理;

注意的是

  1. 备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是不叫严重的;

转载于:https://www.cnblogs.com/George1994/p/6037625.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入

欢迎各位添加微信号:qinchang_198231 加入安全 交流群 和大佬们一起交流安全技术01技术概要这是一种允许攻击者从内存而非磁盘向指定进程注入DLL的技术,该技术比常规的DLL注入更为隐蔽,因为除了不需要磁盘上的实际DLL文件之外,它…

像程序员一样思考_如何像程序员一样思考-解决问题的经验教训

像程序员一样思考by Richard Reis理查德里斯(Richard Reis) 如何像程序员一样思考-解决问题的经验教训 (How to think like a programmer — lessons in problem solving) If you’re interested in programming, you may well have seen this quote before:如果您对编程感兴趣…

CF908G New Year and Original Order 数位DP

传送门 看到数据范围到\(10^{700}\)毫无疑问数位DP。那么我们最重要的问题是如何有效地维护所有数位排序之后的数的值。 对于某一个数\(x\),设\(f_{x,i} (i \in [1,9])\)表示\(x\)中的所有数位的值\(\geq i\)的数位数量,比如说\(f_{6345982 , 7} 2 , f_…

锐捷亮相GITC:请互联网企业为我点个赞!

【51CTO.com原创稿件】GITC全球互联网技术大会已成功举办四届,今年的会议现场依然是摩肩接踵围观者众。围绕互联网热点技术,众人根据云、大数据、安全、运维、基础架构的不同主题,各自聚成小圈子展开深入交流。 锐捷的展位在主会场的内侧&…

c语言汇编混合编程方法,C语言和汇编语言混合编程方法

摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言。两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用。本文通过具体的实例,说明了混合编程的基本方法,为C语言应…

WPF Slider设置整数

IsSnapToTickEnabled"True" 转载于:https://www.cnblogs.com/Fred1987/p/6038608.html

api代理提取_了解提取API

api代理提取Interested in learning JavaScript? Get my ebook at jshandbook.com有兴趣学习JavaScript吗? 在jshandbook.com上获取我的电子书 Since IE5 was released in 1998, we’ve had the option to make asynchronous network calls in the browser using X…

react.lazy 路由懒加载_React lazy/Suspense使用及源码解析

React v16.6.0已经发布快一年了,为保障项目迭代发布,没有及时更新react版本,最近由于开启了新项目,于是使用新的react版本进行了项目开发。项目工程如何搭建,如何满足兼容性要求,如何规范化等等这里不作为介…

Dart编程语言入门

Dart基础入门语法介绍,详细说明可以查看相关视频《Dart编程语言入门》。 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a 10;2.显示类型声明 int a;//null a 10;3.使用 var 声明,可赋予不同类型的值 var a; //null a 10; //int a…

《PHP精粹:编写高效PHP代码》——1.1节为什么要使用面向对象编程

本节书摘来自华章社区《PHP精粹:编写高效PHP代码》一书中的第1章,第1.1节为什么要使用面向对象编程,作者:(美)  Davey Shafik,更多章节内容可以访问云栖社区“华章社区”公众号查看 1.1 为什…

c语言数据结构系统化,C语言数据结构+数据库+操作系统

http://cv.qiaobutang.com/post/55c419b20cf2009bd4607795第二部分是专业相关的C ,数据库,操作系统,数据结构。http://c.biancheng.net/cpp/u/shuju/数据(Data)是信息的载体,它能够被计算机识别、存储和加工处理。它是计算机程序加…

c语言判断一个序列是不是另一个的子序列

1 #include <stdio.h>2 #include <string.h>//添加字符串头文件3 4 int Subsequence(char s[], char t[]) 5 {6 int m,n,i,j;7 n strlen(s); //n表示序列S的长度8 m strlen(t); //m表示序列T的长度9 i0; 10 j0; 11 if (m>…

linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

今日锦囊特征锦囊&#xff1a;如何在Python中处理不平衡数据? Index1、到底什么是不平衡数据2、处理不平衡数据的理论方法3、Python里有什么包可以处理不平衡样本4、Python中具体如何处理失衡样本印象中很久之前有位朋友说要我写一篇如何处理不平衡数据的文章&#xff0c;整理…

源码安装zabbix遇到的报错集锦

报错1&#xff1a;checking for mysql_config... configure: error: MySQL library not found 解决办法&#xff1a;查找mysql_config #find / -name "mysql_config*" /usr/local/mysql/bin/mysql_config 在配置时将原有的 --with-mysql 改为 --with-mysql/usr/loca…

pso算法c++语言代码,一C++PSO(PSO)算法

收集和变化PSO算法&#xff0c;它可用于参考实施&#xff1a;#include #include #include #include #include #define rand_01 ((float)rand() / (float)RAND_MAX)const int numofdims 30;const int numofparticles 50;using namespace std;//typedef void (*FitnessFunc)(fl…

Hadoop不适合哪些场景 哪些场景适合?

Hadoop设计的目的主要包括下面几个方面&#xff0c;也就是所谓的适用场景&#xff1a; 1&#xff1a;超大文件 可以是几百M&#xff0c;几百T这个级别的文件。 2&#xff1a;流式数据访问 Hadoop适用于一次写入&#xff0c;多次读取的场景&#xff0c;也就是数据复制进去之后&a…

微服务 边界服务_遵循这些实用原则以获取精心设计的微服务边界

微服务 边界服务by Jake Lumetta杰克卢米塔(Jake Lumetta) 遵循这些实用原则以获取精心设计的微服务边界 (Follow these practical principles to get well-designed microservices boundaries) 如何避免使微服务太小和紧密耦合 (How to avoid making your microservices too …

ShareEntryActivity java.lang.ClassNotFoundException | Android类找不到问题

错误堆栈&#xff1a; Process: com.mci.smagazine, PID: 23265java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mci.smagazine/com.mci.smagazine.apshare.ShareEntryActivity}: java.lang.ClassNotFoundException: com.mci.smagazine.apshare…

阿里Android p6准备,项目经历准备篇——如何准备阿里巴巴P6/P7前端面试

项目经历准备篇——如何准备阿里巴巴P6/P7前端面试在上次的校招文章之后&#xff0c;有很多同学问有没有社招相关的东西可以写一篇&#xff0c;现在它来了。比起校招&#xff0c;社招更加看重项目经历项目经历反应的思考。本文针对的是想进入阿里的P6/P7同学&#xff0c;着重讲…

for in for of区别_Python 第4课:for…in循环黄金搭档之range()函数

乐学趣学Py● 04&#xff1a;for…in循环黄金搭档之range()函数●Python趣味小百科Python中的绘图模块为什么叫Turtle海龟&#xff0c;而不是cat ,dog,bird呢&#xff1f;原来Python引用了麻省理工大学教授开发的logo海龟制图语言,能通过绘图直观地教大家学习编程。实践是最好的…