定义:
备忘录模式(memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
类图:
代码
战神奎爷类
package ding.study.designpatterns.memento;
/**
* 奎爷类
*
* @author daniel
* @email 576699909@qq.com
* @time 2016-6-18 下午3:27:20
*/
public class KuiYe {
// 生命
private Integer vit;
// 攻击力
private Integer atk;
// 防御力
private Integer def;
/**
* 人物初始值
*/
public KuiYe() {
this.vit = 100;
this.atk = 10;
this.def = 10;
}
/**
* 展示对象属性
* @author daniel
* @time 2016-6-18 下午3:35:47
*/
public void showKuiYe() {
System.out.println("奎爷生命" + this.vit);
System.out.println("奎爷攻击" + this.atk);
System.out.println("奎爷防御" + this.def);
}
/**
* 保存战神进度
* @return
*/
public RoleStateMemento saveState(){
return new RoleStateMemento(this.getVit(),this.getAtk(),this.getDef());
}
/**
* 恢复奎爷状态
* @param memento
*/
public void recoveryState(RoleStateMemento memento){
this.vit=memento.getVit();
this.atk=memento.getAtk();
this.def=memento.getDef();
}
public Integer getVit() {
return vit;
}
public void setVit(Integer vit) {
this.vit = vit;
}
public Integer getAtk() {
return atk;
}
public void setAtk(Integer atk) {
this.atk = atk;
}
public Integer getDef() {
return def;
}
public void setDef(Integer def) {
this.def = def;
}
}
RoleStateMemento 奎爷状态类
package ding.study.designpatterns.memento;
/**
* 游戏属性状态 保存类
* @author daniel
* @email 576699909@qq.com
* @time 2016-6-18 下午3:37:02
*/
public class RoleStateMemento {
// 生命
private Integer vit;
// 攻击力
private Integer atk;
// 防御力
private Integer def;
public RoleStateMemento(int vit,int atk,int def){
this.vit=vit;
this.atk=atk;
this.def=def;
}
public Integer getVit() {
return vit;
}
public void setVit(Integer vit) {
this.vit = vit;
}
public Integer getAtk() {
return atk;
}
public void setAtk(Integer atk) {
this.atk = atk;
}
public Integer getDef() {
return def;
}
public void setDef(Integer def) {
this.def = def;
}
}
RoleStateCaretaker 状态管理类
package ding.study.designpatterns.memento;
/**
* 游戏属性状态管理类
* @author daniel
*
*/
public class RoleStateCaretaker {
//游戏属性状态
private RoleStateMemento memento;
/**
* @return the memento
*/
public RoleStateMemento getMemento() {
return memento;
}
/**
* @param memento the memento to set
*/
public void setMemento(RoleStateMemento memento) {
this.memento = memento;
}
}
测试类
package ding.study.designpatterns.memento;
/**
* 备忘录模式(memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
*
* 输出
*
* 战神开始
奎爷生命100
奎爷攻击10
奎爷防御10
奎爷挂了
奎爷生命0
奎爷攻击10
奎爷防御10
战神恢复
奎爷生命100
奎爷攻击10
奎爷防御10
*
* @author daniel
* @email 576699909@qq.com
* @time 2016-6-18 下午3:40:06
*/
public class ZTestMain {
/**
* @author daniel
* @time 2016-6-18 下午3:39:21
* @param args
*/
public static void main(String[] args) { // TODO Auto-generated method stub
KuiYe zhanshen=new KuiYe();
System.out.println("战神开始");
zhanshen.showKuiYe();
//进度管理类
RoleStateCaretaker log=new RoleStateCaretaker();
//保存战神状态
log.setMemento(zhanshen.saveState());
//战神死了
System.out.println("奎爷挂了");
zhanshen.setVit(0);
zhanshen.showKuiYe();
System.out.println("战神恢复");
//恢复战神
zhanshen.recoveryState(log.getMemento());
zhanshen.showKuiYe();
}
}
输出
战神开始
奎爷生命100
奎爷攻击10
奎爷防御10
奎爷挂了
奎爷生命0
奎爷攻击10
奎爷防御10
战神恢复
奎爷生命100
奎爷攻击10
奎爷防御10
特性
备忘录模式的优点和缺点
一、备忘录模式的优点
1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,
使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需
要的这些状态的版本。
3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
二、备忘录模式的缺点:
1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。
源码
https://github.com/dingsai88/StudyTest/tree/master/src/ding/study/designpatterns/memento