备忘录模式在生活中还是挺常见的一种功能,像编辑器的恢复之前操作,浏览器中的后退以及玩游戏中的悔棋都属于较为常见的一种。
备忘录模式(Memento)的结构
暂时略过:
代码示例(黑箱实现):(大致原理:游戏发起人内部定义Memo对象 对外实现IMemo接口,并保存在Caretker对象里,等Originator经过一系列操作如fight,后想要恢复则调用内部recover接口,参数则是之前保存在Caretker对象里的IMemo对象 从而实现黑箱备忘录实现, 这样对发起人实现了宽接口, 对外实现了窄接口)
备忘录有两个等效的接口:
窄接口:管理者对象(和其他发起人对象之外的任何对象)看到的是备忘录的窄接口,这个窄接口只允许他把备忘录对象传给其他的对象。
宽接口:与管理者看到的窄接口相反,发起人对象可以看到一个宽接口,这个宽接口允许它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态。
package com.mp.mng.platform.memo;
/**
* 备忘录接口(用接口实现, 对外提供窄接口)
*/
public interface IMemo {
}
package com.mp.mng.platform.memo;
/**
* 发起人
*/
public class Originator {
private int stat;//状态
private int vit;//防御力
private int agv;//攻击力
public void initS() {
stat = 100;
vit = 100;
agv = 100;
}
public void fight() {
stat = 0;
vit = 0;
agv = 0;
}
public IMemo saveS() {
return new RoleStateMemo(stat, vit, agv);
}
public void showStatus() {
System.out.println("stat:" + stat);
System.out.println("vit:" + vit);
System.out.println("agv:" + agv);
}
public void recoverS(IMemo memo) {
RoleStateMemo roleStateMemo = (RoleStateMemo) memo;
stat = ((RoleStateMemo) memo).getStat();
vit = ((RoleStateMemo) memo).getVit();
agv = ((RoleStateMemo) memo).getAgv();
}
private class RoleStateMemo implements IMemo {
private int stat;//状态
private int vit;//防御力
private int agv;//攻击力
public RoleStateMemo() {
}
public int getStat() {
return stat;
}
public void setStat(int stat) {
this.stat = stat;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAgv() {
return agv;
}
public void setAgv(int agv) {
this.agv = agv;
}
public RoleStateMemo(int stat, int vit, int agv) {
this.stat = stat;
this.vit = vit;
this.agv = agv;
}
}
}
package com.mp.mng.platform.memo;
/**
* 备忘录管理对象
*/
public class Caretaker {
private IMemo memo;
public IMemo getMemo() {
return memo;
}
public void setMemo(IMemo memo) {
this.memo = memo;
}
}
package com.mp.mng.platform.memo;
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
System.out.println("===========start=============");
originator.initS();
originator.showStatus();
Caretaker caretaker = new Caretaker();
caretaker.setMemo(originator.saveS());
System.out.println("===========end=============");
originator.fight();
originator.showStatus();
System.out.println("===========recover=============");
originator.recoverS(caretaker.getMemo());
originator.showStatus();
}
}
执行结果如下:
版权声明:本文为maguoliang110原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。