> 文章列表 > 设计模式:备忘录模式

设计模式:备忘录模式

设计模式:备忘录模式

一、定义

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

二、角色

  • Originator:发起人,记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  • Memento:备忘录,负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  • Caretaker:管理者,对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

三、 使用场景

  • 需要保存对象在某一时刻的状态和部分状态
  • 不希望外部直接访问其内部状态,通过中间对象,间接访问该对象的内部状态

四、模板代码


/*** 需要保存数据的对象*/
class Originator {private int mValue;public Originator() {}public void handler() {mValue = 100;}public void restore(Memoto memo) {mValue = memo.getState();}/*** 创建备忘录** @return*/public Memoto createMemoto() {Memoto memo = new Memoto();memo.setState(mValue);return memo;}
}/*** 备忘录角色,除了Originator之外的对象都不能够操作该对象*/
class Memoto {private int mState;public Memoto() {}public void setState(int state) {mState = state;}public int getState() {return mState;}
}/*** 负责管理备忘录,但是自己不能操作备忘录*/
class Caretaker {private Memoto mMemo;public Caretaker() {}public Memoto restoreMemoto() {return mMemo;}public void storeMemoto(Memoto memo) {mMemo = memo;}
}//客户端
public class Client {public static void main(String[] args) {Originator ori = new Originator();ori.handler();Caretaker ct = new Caretaker();ct.storeMemoto(ori.createMemoto());Originator ori2 = new Originator();ori2.restore(ct.restoreMemoto());}
}

五、在Android中的使用

Activity状态的保存

onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle savedInstanceState)

当Activity不是正常方式退出时,且Activity在随后的时间内被系统杀死之前会调用这两个方法,可以有机会存储Activity的相关信息,并且在下次返回到Activity时恢复这些数据。

当系统存在“未经允许”时销毁Activity时,onSaveInstanceState 会被调用到,如:

  • 当用户按下Home 键
  • 长按Home 键,选择其他的程序
  • 按下电源键(关闭屏幕)时
  • 从Activity A 中启动一个新的Activity时
  • 屏幕方向切换,如从横屏切竖屏
  • 电话打入时

六、优缺点

优点

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

缺点

  • 消耗资源