备忘录模式(Memento)
2020-03-10 本文已影响0人
jiahzhon
- 定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
- 缺点:
资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
- 主要角色
- 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
- 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
- 结构图
3-1Q119130413927.gif- 代码实现
package memento;
public class MementoPattern
{
public static void main(String[] args)
{
Originator or=new Originator();
Caretaker cr=new Caretaker();
or.setState("S0");
System.out.println("初始状态:"+or.getState());
cr.setMemento(or.createMemento()); //保存状态
or.setState("S1");
System.out.println("新的状态:"+or.getState());
or.restoreMemento(cr.getMemento()); //恢复状态
System.out.println("恢复状态:"+or.getState());
}
}
//备忘录
class Memento
{
private String state;
public Memento(String state)
{
this.state=state;
}
public void setState(String state)
{
this.state=state;
}
public String getState()
{
return state;
}
}
//发起人
class Originator
{
private String state;
public void setState(String state)
{
this.state=state;
}
public String getState()
{
return state;
}
public Memento createMemento()
{
return new Memento(state);
}
public void restoreMemento(Memento m)
{
this.setState(m.getState());
}
}
//管理者
class Caretaker
{
private Memento memento;
public void setMemento(Memento m)
{
memento=m;
}
public Memento getMemento()
{
return memento;
}
}
例子:游戏步数
第一次前进了10步,第二次前进时踩到便便了,然后要回到之前的进度。例如下图结构:
772743-20180909143948342-775978644.png
- 游戏类-发起人
/**
* 游戏
*/
@Data
public class Game {
/**
* 玩家走的步数
*/
private int playerStep;
/**
* 备份游戏
* @return
*/
public GameMemento createGameMemento(){
return new GameMemento(playerStep);
}
/**
* 开始玩游戏
*/
public void play(){
playerStep = 0;
}
/**
* 恢复备份
* @param gameMemento
*/
public void restore(GameMemento gameMemento){
this.playerStep = gameMemento.getPlayerSteps();
}
}
- 备份
/**
* 备份
*/
@Getter
public class GameMemento {
/** 步数 */
private int playerSteps;
/**
* 备份步数
* @param playerSteps
*/
public GameMemento(int playerSteps){
this.playerSteps = playerSteps;
}
}
- 备份信息管理类
/**
* 备份信息管理类
*/
public class Caretaker {
/** 备份 */
private GameMemento gameMemento;
/** 恢复备份 */
public GameMemento retrieveMemento(){
return this.gameMemento;
}
/** 保存备份 */
public void saveMemento(GameMemento gameMemento){
this.gameMemento = gameMemento;
}
}
- 测试
public class Player {
public static void main(String[] args) {
Game game = new Game();
System.out.println("游戏开始,捡到滑板,前进10步");
game.setPlayerStep(10);
//备份当前状态
System.out.println("备份当前状态");
GameMemento gameMemento = game.createGameMemento();
Caretaker caretaker = new Caretaker();
caretaker.saveMemento(gameMemento);
System.out.println("备份完成");
game.play();
System.out.println("踩到便便了,当前步数为:"+game.getPlayerStep());
System.out.println("还原到之前一步");
game.restore(caretaker.retrieveMemento());
System.out.println("恢复完成,当前玩家步数是:"+game.getPlayerStep());
}
}
打印结果:
游戏开始,捡到滑板,前进10步
备份当前状态
备份完成
踩到便便了,当前步数为:0
还原到之前一步
恢复完成,当前玩家步数是:10