前言
- 备忘录模式也是一种行为模式,用来保存对象的当前状态.
定义
- 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.
- 优点:
1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
2.实现信息的封装,使得用户不需要关心状态的保存细节 - 缺点:消耗资源,如果累成员变量过多,势必会占用比较大的资源,而且每一次保存都能消耗一定的内存
- 使用场景:
1.需要保存一个对象在某一个时刻的状态或者部分状态
2.如果用一个接口来让其他对象得到这些状态
UML类图
- originator:发起者,负责创建一个备忘录,可以记录\恢复自身的内部状态
- memento:备忘录角色,用于存储originator的内部状态
- caretaker:负责存储备忘录,不能对备忘录memento的内容进行操作和访问,只能够将备忘录传递给其他对象.
实现步骤
- 书中提供了游戏存档和读取存档的案例.相当具有代表性,足以让我们理解这个模式
- originator:在本案例中,是游戏game实体类.
/**
* 游戏的数据模型model 三种属性,进度\生命值\武器
*
* @author max
*
*/
public class Game {
private int mCheckPoint = 1;
private int mLifeValue = 100;
private String mWeapon = "武器";
// 玩游戏
public void play() {
}
// 退出
public void quit() {
}
// 创建备忘录Memoto实体
public Memoto createMemoto() {
Memoto memoto = new Memoto();
memoto.mCheckPoint = mCheckPoint;
memoto.mLifeValue = mLifeValue;
memoto.mWeapon = mWeapon;
return memoto;
}
// 恢复读取备忘录Memoto实体
public void restore(Memoto memoto) {
this.mCheckPoint = memoto.mCheckPoint;
this.mLifeValue = memoto.mLifeValue;
this.mWeapon = memoto.mWeapon;
}
}
- memento:在本案例中是记录game的实体,和game拥有相同的属性
/**
* 备忘录,记录游戏实体的状态
* 所有参数即游戏实体的参数
* @author max
*
*/
public class Memoto {
public int mCheckPoint;
public int mLifeValue;
public String mWeapon;
}
- caretaker:
/**
* 负责管理Memoto
* 但不能对备忘录Memoto的数据进行操作,只能由游戏实体在create或者restore备忘录实体
* @author max
*
*/
public class Caretaker {
Memoto mMemoto;//备忘录
//存档
public void archive(Memoto memoto){
this.mMemoto = memoto;
}
//获取存档
public Memoto getMemoto(){
return mMemoto;
}
}
源码下载
本案例只是一个简单的备忘录模式demo,便于理解,在实际开发中,我们很容易犯的错误,是在activity类做过多的逻辑处理,混乱且职责太多,把editText相关撤销和重做的功能通过备忘录memoto封装到edittext控件中去.建议有书的童鞋多看看,细细体会,在实际开发中绝对是会有很大的提升的.