前言
备忘录模式是一种行为模式
,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态;
定义:
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态;
使用场景:
- 需要保存一个对象在某一个时刻的状态或部分状态;
- 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态;
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 += 2
println("经验满了,升级了!")
customPass++
println("又打过一关!")
println("-------------------------")
}
/**
* 退出游戏
*/
fun quitGame() {
println("退出游戏,当前第${customPass}关卡,当前${level}级!")
println("-------------------------")
}
/**
* 恢复游戏进度
*/
fun restoreGame(memo: Memo) {
level = memo.level
customPass = memo.customPass
println("重新进入游戏,当前第${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 {
@JvmStatic
fun 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
扮演;
总结
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户方便地回到某个历史状态;
- 实现了信息的封装,使得用户不需要关心状态的保存细节;
缺点:
- 消耗资源,如果类的成员变量过多,会占用较大的资源,每一次保存也会占用一定的内存;
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )