备忘录模式的概念
备忘录模式是一种行为设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象之前的状态。
主要组成部分
1)Originator(原发器)
负责创建一个包含其内部状态的备忘录对象。
可以使用备忘录来恢复其先前的状态。
2)Memento(备忘录)
存储原发器的内部状态,并防止外部对象访问这些状态。
可能会有两种类型的备忘录:一种是简单的,只存储状态;另一种是复杂的,可能包含多个状态快照。
3)Caretaker(管理者)
负责保存和获取备忘录对象,但不应该操作备忘录的内容。
举个栗子
平常我们玩单机游戏的时候,通过一关游戏都有备份存档的功能,当游戏角色死亡时,可以选择之前备份的存档继续开始游戏
如下图:
流程如下
开始游戏===>通关第一关===>备份第一关存档===>通关第二关===>备份游戏第二关存档===>挑战第三关失败,游戏角色死亡===>选择存档==>恢复备份存档2==>继续挑战第三关
使用java代码实现
创建用户状态源发器
java
package org.xiji.menmentopattern;
/**
* 用户状态源发器
*/
public class UserInfoOriginator {
private String userState;
/**
*
* 获取用户状态
*/
public String getUserState() {
return userState;
}
/**
* 设置用户状态
*/
public void setUserState(String userState) {
this.userState = userState;
}
/**
* 保存用户当前状态===>保存为备忘录对象
*/
public UserInfoMemento saveStateToMemento(){
return new UserInfoMemento(this.userState);
}
/**
* 通过备忘录对象恢复用户的某一时刻
*/
public void recoveryUserInfoState(UserInfoMemento userInfoMemento){
this.userState = userInfoMemento.getState();
}
}
创建用户备份管理类
java
package org.xiji.menmentopattern;
import java.util.ArrayList;
import java.util.List;
/**
* 用户备份类管理类
*/
public class UserInfoCaretaker {
/**
* 备份集合
*/
private List<UserInfoMemento> mementoList=new ArrayList<>();
/**
* 添加备份对象
*/
public void add(UserInfoMemento memento) {
mementoList.add(memento);
}
/**
* 获取备份对象
*/
public UserInfoMemento get(int index) {
return mementoList.get(index);
}
}
创建用户备状态备份类
java
package org.xiji.menmentopattern;
/**
* 用户状态备忘录类
*/
public class UserInfoMemento {
/**
* 状态
*/
private String state;
public UserInfoMemento(String state) {
this.state = state;
}
public String getState() {
return state;
}
/**
* 设置状态
* 这里用来保存用户状态
*/
public void setState(String state) {
this.state = state;
}
}
创建BackUpMain启动类
java
package org.xiji.menmentopattern;
/**
* 备忘录模式
*/
public class BackupMain {
public static void main(String[] args) {
//创建游戏角色
UserInfoOriginator gameUser = new UserInfoOriginator();
//角色存档管理器
UserInfoCaretaker gameUserSaveManger = new UserInfoCaretaker();
//通过第一关
System.out.println("通过第一关");
gameUser.setUserState("第一关通关");
//备份
UserInfoMemento firstMemento = gameUser.saveStateToMemento();
System.out.println("备份成功");
//存放在备忘录管理者中
gameUserSaveManger.add(firstMemento);
//通过第二关
System.out.println("通过第二关");
gameUser.setUserState("第二关通关");
//备份
UserInfoMemento twoMemento = gameUser.saveStateToMemento();
System.out.println("备份成功");
//存放在备忘录管理者中
gameUserSaveManger.add(twoMemento);
//用户没有通关,角色死亡
System.out.println("游戏没有通关,角色死亡");
gameUser.setUserState("游戏结束");
System.out.println(gameUser.getUserState());
System.out.println("选择存档,并且恢复存档");
//选择存档,并且恢复存档
gameUser.recoveryUserInfoState(gameUserSaveManger.get(0));
System.out.println("游戏恢复到第一关");
System.out.println(gameUser.getUserState());
//恢复第二关
System.out.println("选择存档,并且恢复存档");
gameUser.recoveryUserInfoState(gameUserSaveManger.get(1));
System.out.println("游戏恢复到第二关");
System.out.println(gameUser.getUserState());
}
}