前言

备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态;

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

使用场景:

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

UML类图:

  • Memo:备忘录角色,用于存储Originator内部状态,并且可以防止Originator以外的对象访问Memo
  • Originator:负责创建一个备忘录,可以记录、恢复自身的内部状态,同时Originator还可以根据需要决定Memo存储自身的哪些内部状态;
  • Caretaker:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象;

实现示例

这里以玩游戏打怪闯关为例,等级level关卡customPass为内部状态,玩游戏时升级闯关改变状态,退出游戏时进行存档,再次进入游戏时读取备忘录数据恢复数据;

  • 定义备忘录角色,Memo
/*** 游戏,备忘录角色,状态记录* @param level 等级* @param customPass 关卡*/
data class Memo(val level: Int = 0, val customPass: Int = 0)
  • 定义创建一个备忘录角色,拥有等级level关卡customPass属性,Originator
/*** 创建一个备忘录,可以记录、恢复自身状态*/
class Originator {/*** 当前等级*/private var level: Int = 0/*** 当前关卡*/private var customPass: Int = 0/*** 玩游戏升级闯关*/fun playGame() {println("当前第${customPass}关卡,当前${level}级!")println("-------------------------")level += 2println("经验满了,升级了!")customPass++println("又打过一关!")println("-------------------------")}/*** 退出游戏*/fun quitGame() {println("退出游戏,当前第${customPass}关卡,当前${level}级!")println("-------------------------")}/*** 恢复游戏进度*/fun restoreGame(memo: Memo) {level = memo.levelcustomPass = memo.customPassprintln("重新进入游戏,当前第${customPass}关卡,当前${level}级!")}/*** 创建备忘录*/fun createMemo(): Memo {return Memo(level, customPass)}}
  • 定义存储备忘录角色,Caretaker
/**** 存储备忘录,不能操作和访问*/
class Caretaker {private var memo = Memo()/*** 存储*/fun saveMemo(memo: Memo) {this.memo = memo}/*** 获取*/fun getMemo(): Memo {return memo}
}
  • 编写测试类,验证功能
object Test {@JvmStaticfun main(args: Array<String>) {val originator = Originator()//升级闯关originator.playGame()originator.playGame()//进行游戏存档val caretaker = Caretaker()caretaker.saveMemo(originator.createMemo())//退出游戏originator.quitGame()//重新进入游戏val newOriginator = Originator()newOriginator.restoreGame(caretaker.getMemo())}
}

结果输出如下:

当前第0关卡,当前0级!
-------------------------
经验满了,升级了!
又打过一关!
-------------------------
当前第1关卡,当前2级!
-------------------------
经验满了,升级了!
又打过一关!
-------------------------
退出游戏,当前第2关卡,当前4级!
-------------------------
重新进入游戏,当前第2关卡,当前4级!

Android源码中的备忘录模式

  • Activity中的onSaveInstanceState(outState: Bundle)onRestoreInstanceState(savedInstanceState: Bundle)方法
  1. 这里Activity扮演了Caretaker的角色,负责存储、恢复UI的状态信息;
  2. 界面中的View、ViewGroup等扮演了Originator的角色,代表需要存储状态的对象;
  3. 数据存储角色Memo则由Bundle扮演;

总结

优点:

  • 给用户提供了一种可以恢复状态的机制,可以使用户方便地回到某个历史状态;
  • 实现了信息的封装,使得用户不需要关心状态的保存细节;

缺点:

  • 消耗资源,如果类的成员变量过多,会占用较大的资源,每一次保存也会占用一定的内存;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

Android设计模式详解之备忘录模式相关推荐

  1. Android设计模式详解之建造者模式

    前言 Builder模式是一种创建型设计模式. 定义:将一个复杂对象的创建与它的表示分离,使得同样的构造过程可以创建不同的表示. 使用场景: 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部 ...

  2. Android设计模式详解之解释器模式

    前言 解释器模式是一种使用较少的行为型模式: 提供了一种解释语言的语法或表达式的方式,通过该接口解释一个特定的上下文. 定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示 ...

  3. Android设计模式详解之责任链模式

    前言 责任链模式是行为型设计模式: 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 使用场景: 多 ...

  4. Android设计模式详解之观察者模式

    前言 观察者常用于订阅-发布系统,能够将观察者和被观察者进行解耦,降低两者之间的依赖: 定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新. ...

  5. C++设计模式详解之外观模式解析

    C++ 外观模式 外观模式定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用. 个人理解:外观模式,实际就是添加一层封装 比较简单 外观模式实例 ...

  6. C++设计模式详解之模板模式解析

    C++ 模板方法模式解析 模板方法模式定义 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现 模板方法模式实例 以考试为例,考数学和考语文的过程几乎都是一样的,就是准备考试,背书,写试 ...

  7. C++设计模式详解之命令模式解析

    C++ 命令模式定义 命令模式将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象. 个人理解: 命令模式,其实实质上就是去耦合的操作,让各个部分尽可能的关联性降低,以便修改或增加某些功 ...

  8. C++设计模式详解之工厂模式解析

    C++ 工厂方法模式解析 工厂方法模式原则 让子类决定该创建的对象是什么,来达到将对象创建的过程.封装了对象创建的过程.实现了封装的目的.主要就是创建者类和产品类,让创建者自动绑定产品. 工厂方法模式 ...

  9. 设计模式详解:建造者模式

    今天来看一下创建新模式中的第五种模式:建造者模式.仍然是先看两张图,复习模式类型,加深记忆. 定义: 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Build ...

最新文章

  1. NLP分词数据准备及模型训练实例
  2. 一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式
  3. 第十四次ScrumMeeting博客
  4. 图片存储解决方案的分析
  5. iphone 各种例子 汇总
  6. 都说dlib是人脸识别的神器,那到底能不能识破妖怪的伪装?
  7. 【CF#148B】Escape(模拟)
  8. 学计算机的普通学生那里就业,学计算机我后悔了 现在好就业吗
  9. 隐藏Jquery dialog 按钮
  10. 常用编码软件简单使用记录 1 : 自主编码器
  11. MQL5语法基础(三)
  12. APK修改神器:插桩工具 DexInjector
  13. 服务器安全文件,文件服务器安全防护系统-虹安 - 数据防泄密,文档加密,源代码防泄密,数据防泄漏,DLP数据防泄密整体解决方案提供商...
  14. Octotree 下载安装
  15. C# 将字符串转换成GB2312--很蛋疼的一个Class
  16. 阿拉伯世界的历史现状与前景2019尔雅满分答案
  17. 线性判别函数:感知器、松弛算法、Ho-Kashyap算法
  18. oracle挂载磁盘阵列,数据库服务器没正常挂载磁盘阵列导致无法启动(一)
  19. LSF_管理软件许可证和其他共享资源
  20. ECharts实现数据可视化超详细基础入门教程

热门文章

  1. apache commons-io相关介绍-monitor包
  2. A、B、C、D、E类网络地址
  3. 平车调整刀片如何调整_裁切机的上刀下刀如何调整?
  4. 坚果云一直显示分析的解决办法与ubuntu下坚果云选择性忽略的方法
  5. SQL重复记录处理(查找,过滤,删除) 1
  6. java this作为参数_Java this关键字
  7. 因游戏找代练影响仕途?韩国女议员到底冤不冤?
  8. Flutter学习记录-开篇
  9. 移动安全总结 2019
  10. 从0到1绘制蜡烛线(实现细节)