第十三章、备忘录模式

备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,有点像是我们平常说的”后悔药”。

1.定义

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

2.使用场景

(1)需要保存一个对象在某一个时刻的状态或部分状态。

(2)如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。

3.简单实现

书中例子:以”使命召唤”游戏为例,用游戏中的存档功能来举例。

首先是备忘录类

/*** 备忘录类*/
public class Memento {public int mCheckpoint;//武器public int mLiftValue;//生命public String mWeapon;//关卡@Overridepublic String toString() {return "Memento [mCheckpoint=" + mCheckpoint + ",mLiftValue="+ mLiftValue + ",mWeapon=" + mWeapon + "]";}}

游戏类,在该类可以通过createMemento函数来创建该用户的备忘录对象,外部可以通过restore函数将CallOfDuty 对象的状态从备忘录对象中恢复。

/*** * 简单模拟“使命召唤”游戏 * */public class CallOfDuty {private int mCheckpoint = 1;private int mLiftValue = 100;private String mWeapon = "沙漠之鹰";//玩游戏public void play(){System.out.println("打游戏:"+String.format("第%d关", mCheckpoint) + "奋战杀敌中");mLiftValue -= 10;System.out.println("进度升级了");mCheckpoint++;System.out.println("到达" + String.format("第%d关", mCheckpoint));}//退出游戏public void quit(){System.out.println("--------------");System.out.println("退出前的游戏属性:" + this.toString());System.out.println("退出游戏");System.out.println("--------------");}/***创建备忘录 */public Memento createMemento(){Memento memento = new Memento();memento.mCheckpoint = mCheckpoint;memento.mLiftValue = mLiftValue;memento.mWeapon = mWeapon;return memento;}//恢复游戏public void restore(Memento memento){this.mCheckpoint = memento.mCheckpoint;this.mLiftValue = memento.mLiftValue;this.mWeapon = memento.mWeapon;System.out.println("恢复后的游戏属性:" + this.toString());}//省略getter和setter方法@Overridepublic String toString() {return "CallOfDuty [mCheckpoint=" + mCheckpoint + ",mLiftValue="+ mLiftValue + ",mWeapon=" + mWeapon + "]";}
}

备忘录操作类:

/*** Caretaker,负责管理Memento*/
public class Caretaker {Memento mMemento; //备忘录/*** 存档*/public void archive(Memento memento){this.mMemento = memento;}/*** 获取存档*/public Memento getMemento(){return mMemento;}
}

客户端使用代码:

public class Client {public static void main(String[] args) {//构建游戏对象CallOfDuty game = new CallOfDuty();//1.打游戏game.play();Caretaker caretaker = new Caretaker();//2.游戏存档caretaker.archive(game.createMemento());//3.退出游戏game.quit();//4.恢复游戏CallOfDuty newGame = new CallOfDuty();newGame.restore(caretaker.getMemento());//5.再次打游戏(不存档)game.play();//6.恢复之前存档newGame.restore(caretaker.getMemento());}
}

结果:

打游戏:第1关奋战杀敌中
进度升级了
到达第2关
--------------
退出前的游戏属性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鹰]
退出游戏
--------------
恢复后的游戏属性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鹰]
打游戏:第2关奋战杀敌中
进度升级了
到达第3关
恢复后的游戏属性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鹰]

上面的代码中,各个角色职责清晰、单一,代码也比较简单,即对外屏蔽了对CallOfDuty角色的直接访问,在满足了对象状态存取功能的同时也使得该模块的结构保持清晰、整洁。

4.Android源码中的备忘录模式

1.onSaveInstanceState和onRestoreInstanceState

当Activity不是正常方式退出,且Activity在随后的时间内被系统杀死之前会调用这两个方法让开发人员可以有机会存储Activity相关信息,且在下次返回Activity时恢复这些数据。通过这两个函数。开发人员能够在某些特殊场景下储存与界面相关的信息,提升用户体验。

基本使用参考:链接

5.总结

1.优点

(1)给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史状态。

(2)实现了信息的封装,使用户不需要关心状态的保存细节。

2.缺点

消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。


PS:这篇应该是今年的最后一篇了,《Android源码设计模式解析与实战》一共26章,这个月刚好看到了一半了,下个月继续努力。最后也祝大家元旦快乐,在新一年技术突飞猛进!!最后谢谢大家的支持,就这样!

《Android源码设计模式解析与实战》读书笔记(十三)相关推荐

  1. OREILLY Programming .NET 3.5 读书笔记之一

    OREILLY Programming .NET 3.5 读书笔记之一 <Programming .NET 3.5>是OREILLY 2008.08出版的.NET 3.5 开发书籍,作者是 ...

  2. 《Programming in Scala》读书笔记(持续更新) - passover的个人空间 - DOIT博客 - 多易网...

    <Programming in Scala>读书笔记(持续更新) - passover的个人空间 - DOIT博客 - 多易网 <Programming in Scala>读书 ...

  3. 《Programming in Lua 3》读书笔记(十三)

    日期:2014.7.16 PartⅡ 17 Weak Tables and Finalizers Lua实现的是自动的内存管理.程序可以创建对象,可是没有现成的函数来实现删除对象.Lua使用 garb ...

  4. 《Programming in Lua 3》读书笔记(一)

    断断续续的看这本书快一个月了,由于平时要上班所以读书时间是零碎的,再加上直接看的是英文版,而自己的英语水平就那样,所以进度不咋样.快一个月了,300来页的电子版至今才看到40来页.当然一开始我也没做很 ...

  5. 【读书笔记】语言基础- Lua语言入门(一)

    目录 注:本系列为<Lua程序设计-第4版> 的读书笔记,其中的见解有不完善的地方,可以在评论区指出,原版请看图书 Lua运行环境 一. 使用Lua语言解释器运行Lua语言:(下面的实例以 ...

  6. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  7. 【读书笔记】.NET本质论第四章-Programming with Type(Part Two)

    欢迎阅读本系列其他文章: [读书笔记].NET本质论第一章 The CLR as a Better COM [读书笔记].NET本质论第二章-Components(Part One) [读书笔记].N ...

  8. 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)

    Table of Contents 加速包处理的vhost优化方案 142.vhost的演进和原理 143.Qemu与virtio-net 144.Linux内核态vhost-net 145.用户态v ...

  9. 《The C Programming Language》读书笔记 说明

    <The C Programming Language>读书笔记 说明 作为笔记而言,完全是一种自写自看的行为,本来是没有必要写这篇东西的.但是作为一个生活在网络时代的学 生来说,想学好一 ...

  10. 【“计算机科学与技术”专业小白成长系列】SICP 读书笔记: The Elements of Programming

    SICP 读书笔记: The Elements of Programming 编程元素 强大的编程语言不仅仅是一种指示计算机执行任务的方法.语言也可以作为一个框架,我们可以在其中组织关于过程的想法.当 ...

最新文章

  1. 此博客作废,请访问http://www.cnblogs.com/default
  2. Linux下gcc编译中关于头文件与库文件搜索路径相关问题
  3. 智能实验室-全能优化(Guardio) 4.96.0.850
  4. java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况
  5. weblogic 升级bsu_Weblogic补丁升级之坑坑洼洼
  6. python列表冒号逗号常规用法
  7. 深度学习中的正则化技术详解
  8. linux下异步IO的简单例子
  9. bootstrap 兼容哪些浏览器
  10. 神剧《切尔诺贝利》引发的技术思考:如何避免下一次核灾难?
  11. 谈谈Pod在微服务中的运用
  12. 第001讲 html介绍 html运行原理
  13. 深度森林论文阅读笔记
  14. 移动硬盘损坏:文件或目录已损坏(修复实录)
  15. c#操作Excel表格插入行和列代码
  16. 计算机max函数的格式,Word怎么输入Max公式
  17. 电磁仿真软件CST2020 下载链接及安装破·解教程笔记
  18. 【C语言】简单的飞机游戏
  19. CAD注记层转到SDE Annotation Features(ArcEngine,C++实现)(转载)
  20. FusionGAN:一种生成式红外与可见光图像融合对抗网络

热门文章

  1. Cyrillic script
  2. 简单的项目规模统计方法
  3. .Net中的frame框架
  4. Kubernetes:Service
  5. Python攻城的成长————网络编程
  6. LNMP部署+上线wordpre
  7. CIR、CBS、EBS、PIR、PBS的含义
  8. 千锋教育Web前端——PC端企业类型整页制作
  9. (二)socket收发准备函数——网络编程
  10. Java判断字符串是中文还是英文