Android中的源码设计模式-备忘录模式

定义

备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性。

比较官方的定义

备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。
定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

角色

1.笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出备忘录来恢复状态。
2.备忘录类:实体类用来记录笔记本的状态
3.备忘录管理类:用于管理备忘录,存储和取出。

优缺点

一、备忘录模式的优点
1、使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。
3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
二、备忘录模式的缺点:
1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。

在Android中的典型使用

状态保存是Android中备忘录模式的典型使用,主要对应Activity的两个回调方法onSaveInstanceState()和OnrestoreInstanceState()

角色对应

1.Bundle对应备忘录:Android的状态,包括视图树状态和Fragment状态以及生命周期状态都是通过Bundle这个数据结构存储键值对的Parcel对象保存的,特别注意一点,对于同一个Activity的视图放到一个Bundle中用SparceArray(类似HashMap不过空间使用效率更高,内部查找二分法,而且键只能是整数)来存储。键:ViewId。值:对应的Parcel对象,所以ViewId不能重复,不然会覆盖。
2.Activity对应备忘录管理类。严格来说应该是Activity中的内部属性。mActivity实际是一个ActivityClientRecord集合,每个Activity的信息对应一个ActivityClientRecord,相应的键是Token。ActivityClientRecord的Bundle类型的State对应Bundle(备忘录)。
3.View和Fragment等都对应笔记本类,他们都需要伴随Activity的生命周期函数onSaveInstanceState()和OnrestoreInstanceState()通过Bundle这种数据结构完成自己状态的管理。

顺便提一句

状态保存和视图绘制以及事件响应一样。都是通过委派的责任链设计模式,是一个U型结构,具体下篇会讲一下Android的里面的责任链设计模式。

最后

如有错误,欢迎指正交流。

你可能感兴趣的:(android)