介绍

关于Java设计模式我们都知道有一种备忘录模式,对于作用看名字大概就知道应该和状态保存有关。本文就从定义到示例代码进行说明详解。

定义

备忘录模式定义:在不破坏封装性的前提下,捕获对象的内部状态。
本质:保存和恢复内部状态
作用:在不暴露内部状态不破坏封装完整性的前提下,能够统一的得到内部状态,并且在恰当的时机恢复内部状态。

内部状态

在一个java类里面,不可避免的需要保存一些数据(除非是一个纯静态方法构成的工具类或者其他)。因为这些内部状态很关键,比如一个内部状态是该类某个功能程序分支执行的关键值。

备忘录对象

因为内部状态在某些情况下又可能丢失(如内存紧张),就需要引入一些保存机制(如序列化然后以文件形式持久化保存)。针对复杂或者多个的数据值,我们就会封装数据对象,这个就是备忘录对象,为了让外部无法访问备忘录对象的值(即类的内部状态值),我们就会使用私有内部类,然后只暴露一个备忘录对象的访问方法。实现封装。同时这个备忘录对象是由外部负责保存,为了统一访问就需要标识类,也因为需要避免外部通过标识类访问到内部数据,备忘录模式就引入窄接口,一个空接口形式定义的标识类。这样就同时实现了统一访问和避免外部访问内部数据。

示例代码

以上就是对于备忘录模式的一些文字说明,以下代码基于上文的考虑,实现备忘录模式,并贴出使用代码。

先给出各个模块的名称和定义:
Memento:备忘录,它两个定义形式,窄接口定义:用于统一标识备忘录数据类。内部类的实现形式定义:具体的存储数据形式,它决定保存那些内部数据,因为定义在原发器内可以直接访问原发器内部数据。
Originator:原发器,可以使用备忘录保存某个瞬间的自身状态,也可以使用备忘录恢复内部状态。
Caretaker:备忘录管理者,主要负责对备忘录对象的保存,但是因为封装它不能对备忘录的具体内容进行操作和检查。

Memento窄接口

/*** Created by LiCola on 2017/7/4.* 备忘录 窄接口* 用于对类型的标记*/
public interface Memento {}

Originator原发器

/*** Created by LiCola on 2017/7/4.* 原发器* 持有内部状态 以及一些方法操作等* 实现备忘录数据封装 提供内部状态的封装实现功能 、从外部恢复内部数据功能*/
public class Originator {/*** 需要保存的 内部状态*/private String status;/*** 运行方法 修改内部状态*/public void doSomething(){status="run";}/*** 创建基于窄接口的内部类* 并保存内部状态到内部类* @return*/public Memento createMemento() {MementoImpl memento = new MementoImpl();memento.status = status;//保存操作return memento;}/*** 从外部 恢复内部状态* @param memento*/public void setMemento(Memento memento) {if (memento instanceof MementoImpl) {status = ((MementoImpl) memento).status;//恢复操作}}@Overridepublic String toString() {return "Originator{" +"status='" + status + '\'' +'}';}/*** 窄接口的内部实现类*/
private static class MementoImpl implements Memento {/*** 使用默认修饰符* 简化数据的set和get方法*/String status;public MementoImpl() {}}
}

Catetaker备忘录管理者

/*** Created by LiCola on 2017/7/4.* 备忘录管理者* 实现对备忘录窄接口实现类的保存和恢复*/
public class Caretaker {/*** 为示例简单 只以内存形式保存*/private Memento memento;/*** 保存到内存* @param memento*/public void saveMemento(Memento memento) {this.memento = memento;}/*** 从内存中恢复数据* @return*/public Memento retriveMemento() {return memento;}}

使用示例

/*** Created by LiCola on 2017/7/4.* 备忘录使用示例*/
public class MementoClient {public static void main(String[] args) {Originator originator = new Originator();originator.doSomething();//使用对象 做了一些操作Caretaker caretaker = new Caretaker();caretaker.saveMemento(originator.createMemento());//保存原发器某个瞬间状态//假设被置空 回收了originator = null;Originator originatorRebuild = new Originator();//创建新的对象originatorRebuild.setMemento(caretaker.retriveMemento());//从管理器中恢复保存状态System.out.println(originatorRebuild.toString());//输出 "Originator{status='run'}"表示成功恢复内部状态}
}

总结

备忘录的关键

我们首先要清楚的知道,备忘录的关键在于得到某个对象的内部状态,并暴露一个隐藏内部实现的窄接口,并由外部管理器负责数据的保存。每个模块功能清晰且互相关联。
备忘录模式还包含了,内部类和外部类访问,类型转换等Java语法。

备忘录的广义定义

上文实现代码是为了更好的示例,很多时候在实际的使用中对每个模块不会这么明晰的定义,比如备忘录管理者是被广义的定义在某个类之中,某个类集成了备忘录管理者的功能,而标识类(窄接口)内部也会有一些方法或者直接就是其他接口的形式定义(如Parcelable可以逻辑上定义为标识类)。我们学习设计模式是在学习的它的设计思想而不必拘泥一个具体形式。所以我认为备忘录模式更像是一种方法论一种看问题的方法。

备忘录的优点缺点

优点:在项目或框架中,备忘录模式封装的原发器的内部数据的保存和恢复操作,规范外部的访问和能够让外部能够统一的处理,同时也简化了操作,并明晰的定义各个模块的职责。使得代码逻辑清晰。
缺点:如果非要说的就是内存的开销,因为每一个瞬间内部状态保存都创建了一个对应的备忘录对象,频繁的操作是有内存开销的。

备忘录模式的使用

关于本文备忘录模式的讲解是为Android开发中Activity、Fragment、View等组件状态的保存和恢复操作的理解基础。在Android开发中关于以上组件状态保存是基础也是学习源码的关键。

参考

  1. 研磨设计模式

设计模式-备忘录模式(Memento)的详解相关推荐

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

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

  2. 【学习笔记】设计模式-备忘录模式(Memento)

    文章目录 0 设计模式 1 备忘录模式 2 实现思路 3 需要的类 4 具体实现 4.1 Memento(备忘录) 4.2 Originator(目标对象) 4.3 CareTaker(管理者) 4. ...

  3. java memento_浅谈Java设计模式——备忘录模式(Memento)

    一.概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.它实现了对信息的封装,使得客户不需要关心状态保存的细节.保存就要消耗资源 ...

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

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

  5. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少人的心弦,一段五百年都没有结 ...

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

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

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

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

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

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

  9. 设计模式 | 备忘录模式及典型应用

    本文的主要内容: 介绍备忘录模式 示例 备忘录模式总结 备忘录模式 备忘录模式经常可以遇到,譬如下面这些场景: 浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭 ...

最新文章

  1. mongoTemplate 条件查询
  2. 开发者福利,BCH通用数据库Bitdb 2.0来了
  3. interface接口_接口 interface
  4. 2020年产品经理生存报告
  5. docker项目部署 php_使用Docker部署PHP开发环境的方法详解
  6. 分治算法——快速排序
  7. php通过post请求_php代码post请求
  8. e3mall商城的归纳总结10之freemarker的使用和sso单点登录系统的简介
  9. python 网格搜索_网格搜索查找AUC参数
  10. cad2019菜单栏怎么调出来_AutoCAD2019工具栏怎么调出来 工具栏没了找不到解决方法...
  11. Spring AOP基础组件 Advised
  12. 捍宇医疗再冲刺科创板上市:核心产品专利来自购买,暂未商业化
  13. 架构设计:系统存储(21)——图片服务器:详细设计(1)
  14. python程序结构和异常处理
  15. 性能测试:一个完整的性能测试过程
  16. 现代社会科学的优选法:谈取向运作法
  17. bzoj1038 [ZJOI2008]瞭望塔(半平面交)
  18. 10款常见的Webshell检测工具
  19. android 不保留活动,Android5.0之后打开开发者选项中的不保留活动,解决方案
  20. 照片秒变卡通风!教你用PaddleGAN快速生成你的专属卡通头像

热门文章

  1. 精武风云java_《精武风云》最后一局不精彩
  2. CreateThreadpoolIo 函数小记
  3. FL Studio中文版21最新免费音乐编曲软件制作工具
  4. the book of why笔记_2_从海盗到豚鼠
  5. Deep Learning(深度学习)学习系列之(六)
  6. 物是人非的伤感日志:你回头,对方已不再等待
  7. 启用tun设备开启tap虚拟网卡功能
  8. 超强的色彩和构图,丹麦插画家 Rune Fisker 作品
  9. 一个女孩子的创业体验 (转载)
  10. ORB_SLAM错误总结