设计模式—行为型模式之备忘录模式
备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。这是一种对象行为型模式。
有如下角色:
-
发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
-
备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
-
管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
示例
比如我们有一个奥特曼游戏,每一个奥特曼有血量,等级,我们可以建一个游戏备份来保存这些有用的内容,并使用游戏服务器管理他们。
奥特曼类如下:
@Data
public class Ultraman {
private Integer hp;//血量
private Integer level;//等级
//备忘录管理者
private GameServer gameServer = new GameServer();
/**
* 进行游戏
*/
public void play(){
hp = level = new Random().nextInt();
}
/**
* 保存备忘录
*/
public void saveRocord() throws Exception {
System.out.println("保存备忘录");
gameServer.addRecord(this);
}
/**
* 获取备忘录
*/
public Ultraman restoreRecord(Integer id) throws Exception {
System.out.println("获取记录");
return gameServer.getRecord(id);
}
public void exit() throws Exception {
System.out.println("退出并存档");
gameServer.addRecord(this);
}
}
记录类如下:
/**
* 游戏备份----备忘录
*/
@Data
public class GameRocord {
private Integer id;//备忘录id
private Integer hp;//血量
private Integer level;//等级
}
游戏服务器类如下:
/**
* 游戏服务器——备忘录管理者
*/
public class GameServer {
//记录id
private Integer i = 1;
//备忘录管理
private Map<Integer,GameRocord> recordMap = new HashMap<>();
/**
* 添加备忘录
*/
public void addRecord(Ultraman ultraman) throws Exception {
GameRocord gameRocord = new GameRocord();
BeanUtils.copyProperties(gameRocord,ultraman);
gameRocord.setId(i++);
recordMap.put(gameRocord.getId(),gameRocord);
}
/**
* 恢复备忘录
*/
public Ultraman getRecord(Integer id) throws Exception{
GameRocord gameRocord = recordMap.get(id);
Ultraman ultraman = new Ultraman();
BeanUtils.copyProperties(ultraman,gameRocord);
return ultraman;
}
}
测试类如下:
public class MementoTest {
public static void main(String[] args) throws Exception {
Ultraman ultraman = new Ultraman();
//进行游戏
ultraman.play();
//存档
ultraman.saveRocord();
ultraman.setHp(1);
ultraman.saveRocord();
Ultraman ultramanRecord = ultraman.restoreRecord(1);
ultraman.exit();
}
}
运行截图如下: