“备忘录模式”就这么简单

备忘录模式的官方定义:

在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之外保存这些状态。这样以后就可以通过该对象恢复到原先保存的状态。

大白话说:

一个对象中一般都封装了很多属性,这些属性的值会随着程序的运行而变化。当我们需要保存某一时刻对象的某些值的时候,我们就再创建一个对象,将当前对象中的一些属性保存到新的对象中,当我们需要恢复的时候再从新的对象中取出属性值即可。这种想法就是备忘录模式。

备忘录模式的类图:

1.需要备份的类是Orginator,备份的数据保存在Mementor中,由CareTaker来管理Mementor。

2.Orginator中必须含有两个函数,一个是createMementor(),用来创建Mementor对象,并将需要备份的数据保存到该对象中;另外一个是setMementor(Mementor),用来恢复数据,将传入的Mementor对象中的数据取出来,赋给当前对象中的属性。

不用备忘录模式进行备份对象信息:

调用者使用别人提供给我们的Orginator对象,用着用着我们突然想要保存Orginator对象中的数据了,此时我们一般会再创建个Orginator对象,把需要保存的数据一个个地复制到新的Orginator对象中去。然后当我们需要还原的时候,再将新Orginator对象中的数据一个个拷到旧的Orginator对象中去。

这种方式有个巨大的缺陷:

我们在保存属性的时候需要记住保存了哪些属性,好在还原的时候将这些属性再复制给原来的对象。如果需要保存的属性发生了变化,那么我们还需要修改自己的代码。

使用了备忘录模式的好处:

使用了备忘录模式之后,对方在提供给我们Orginator类的基础上还给我们提供了Mementor、CareTaker类。我们客户端只需要在需要备份的地方调用createMementor()函数,需要还原的地方调用setMementor。如果需要备份的属性发生了变化,那也只是第三方类库Orginator、Mementor进行了修改,对于我们客户端来说,代码不需要任何修改。

备忘录模式与克隆的区别?

有的人说,备忘录模式就是用来保存对象中一些属性,那么当我们需要备份对象中属性的时候完全可以克隆这个对象嘛,何必采用构造这么复杂的备忘录模式呢?

原因有以下几点:

1.进行一次克隆会将对象的全部属性都复制到一个新的对象中去,而当我们仅需要备份对象中一部分属性的时候就只能使用备忘录模式。

PS:在只备份一部分属性的时候也可以新建一个对象,然后把需要备份的属性一一复制给新对象中;然后当还原的时候再一一复制到原本的对象中去。但这样做太烂了!因为客户端在备份的时候必须要记住哪些属性备份了,好在还原的时候还原这些属性。而且当需要备份的属性发生变化的时候,必须修改客户端代码,这很不科学。

2.使用备忘录模式之后,当需要备份的属性发生变化后,只需修改Orginator类和Mementor类,无需修改客户端代码。

3.使用备忘录模式之后,备份数据虽然交给了其他对象保存,但对象的备份操作和还原操作都是通过对象本身的函数实现的,因此体现了封装的思想。

什么时候使用备忘录模式?

当一个对象需要记录其历史属性,并且需要记录的属性是所有属性的一部分时,可以使用备忘录模式记录属性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DannyHoo的专栏

几种单例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

662
来自专栏xingoo, 一个梦想做发明家的程序员

Kibana中doc与search策略的区别

在kibana中包含两种策略:doc和search。使用了两个循环队列来获取请求,并进行响应。 doc的代码如下: clientMethod: 'mget' ...

21510
来自专栏虚拟化云计算

OpenStack数据库远程对象模型

在OpenStack的各个服务之间有些数据库对象是远程操作的,远程对象所实现的效果是:一个 A 服务中的远程对象实例,可以由消息队列传送到B 服务,B 服务能够...

702
来自专栏坚毅的PHP

mysql复制学习一

mysql复制传统上是基于语句的复制,5.0实现了基于行的复制。基于语句复制将执行语句及执行信息写入二进制日志中。 二进制日志包含 binlog和索引文件。bi...

3439
来自专栏coding

了解vue.js的生命周期函数四个生命周期函数两个运行中的事件

692
来自专栏智能大石头

2,ORM组件XCode(速览)

    啥也不说,上图: image.png     这是最基本的增删改查代码!     符合X系列组件的一贯作风,不求万能,只求简单实用!    ...

1729
来自专栏学习有记

数据库连接对象的使用

962
来自专栏coder修行路

Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子。 Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将respo...

2918
来自专栏JavaQ

深入Spring Boot (九):Web应用统一异常处理

默认情况下,Spring Boot为基于SpringMVC的Web应用提供了全局统一异常处理,本篇将深入介绍默认的统一异常处理及自定义异常处理,主要包含以下4部...

3368
来自专栏学习力

《Java从入门到放弃》框架入门篇:Struts2的基本访问方式(二)

1384

扫描关注云+社区