Android设计模式详解之备忘录模式
前言
备忘录模式是一种行为模式
,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态;
定义:
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态;
使用场景:
- 需要保存一个对象在某一个时刻的状态或部分状态;
- 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态;
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)
方法
- 这里
Activity
扮演了Caretaker
的角色,负责存储、恢复UI的状态信息; 界面中的View、ViewGroup等
扮演了Originator
的角色,代表需要存储状态的对象;数据存储角色Memo
则由Bundle
扮演;
总结
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户方便地回到某个历史状态;
- 实现了信息的封装,使得用户不需要关心状态的保存细节;
缺点:
- 消耗资源,如果类的成员变量过多,会占用较大的资源,每一次保存也会占用一定的内存;
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )
Android设计模式详解之备忘录模式相关推荐
- Android设计模式详解之建造者模式
前言 Builder模式是一种创建型设计模式. 定义:将一个复杂对象的创建与它的表示分离,使得同样的构造过程可以创建不同的表示. 使用场景: 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部 ...
- Android设计模式详解之解释器模式
前言 解释器模式是一种使用较少的行为型模式: 提供了一种解释语言的语法或表达式的方式,通过该接口解释一个特定的上下文. 定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示 ...
- Android设计模式详解之责任链模式
前言 责任链模式是行为型设计模式: 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 使用场景: 多 ...
- Android设计模式详解之观察者模式
前言 观察者常用于订阅-发布系统,能够将观察者和被观察者进行解耦,降低两者之间的依赖: 定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新. ...
- C++设计模式详解之外观模式解析
C++ 外观模式 外观模式定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用. 个人理解:外观模式,实际就是添加一层封装 比较简单 外观模式实例 ...
- C++设计模式详解之模板模式解析
C++ 模板方法模式解析 模板方法模式定义 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现 模板方法模式实例 以考试为例,考数学和考语文的过程几乎都是一样的,就是准备考试,背书,写试 ...
- C++设计模式详解之命令模式解析
C++ 命令模式定义 命令模式将请求封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象. 个人理解: 命令模式,其实实质上就是去耦合的操作,让各个部分尽可能的关联性降低,以便修改或增加某些功 ...
- C++设计模式详解之工厂模式解析
C++ 工厂方法模式解析 工厂方法模式原则 让子类决定该创建的对象是什么,来达到将对象创建的过程.封装了对象创建的过程.实现了封装的目的.主要就是创建者类和产品类,让创建者自动绑定产品. 工厂方法模式 ...
- 设计模式详解:建造者模式
今天来看一下创建新模式中的第五种模式:建造者模式.仍然是先看两张图,复习模式类型,加深记忆. 定义: 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Build ...
最新文章
- NLP分词数据准备及模型训练实例
- 一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式
- 第十四次ScrumMeeting博客
- 图片存储解决方案的分析
- iphone 各种例子 汇总
- 都说dlib是人脸识别的神器,那到底能不能识破妖怪的伪装?
- 【CF#148B】Escape(模拟)
- 学计算机的普通学生那里就业,学计算机我后悔了 现在好就业吗
- 隐藏Jquery dialog 按钮
- 常用编码软件简单使用记录 1 : 自主编码器
- MQL5语法基础(三)
- APK修改神器:插桩工具 DexInjector
- 服务器安全文件,文件服务器安全防护系统-虹安 - 数据防泄密,文档加密,源代码防泄密,数据防泄漏,DLP数据防泄密整体解决方案提供商...
- Octotree 下载安装
- C# 将字符串转换成GB2312--很蛋疼的一个Class
- 阿拉伯世界的历史现状与前景2019尔雅满分答案
- 线性判别函数:感知器、松弛算法、Ho-Kashyap算法
- oracle挂载磁盘阵列,数据库服务器没正常挂载磁盘阵列导致无法启动(一)
- LSF_管理软件许可证和其他共享资源
- ECharts实现数据可视化超详细基础入门教程