最长见于游戏状态保存,该模式不需要知道游戏具体状态,只是保存起来,等待需要的时候恢复。
UML图:
orininator 类是对memonto类的操作类。
Memonto是状态类,记录了游戏的数据状态。
CareTaker是保存memonto的类,不能修改memonto的内容!
/*存取的内容,包含很多载体。 * * */ public class StatusMemonto { private String _mStatus; public StatusMemonto(String status) { this._mStatus = status; } /** * @return the _mStatus */ public String getStatus() { return _mStatus; } }
/*StatusTaker 只能存取Memonto,不能修改memonto的内容。 * * * */ public class StatusTaker { private StatusMemonto _mMemonto; /** * @return the _mMemonto */ public StatusMemonto get_mMemonto() { return _mMemonto; } /** * @param _mMemonto the _mMemonto to set */ public void set_mMemonto(StatusMemonto _mMemonto) { this._mMemonto = _mMemonto; } }
package com.jayfulmath.designpattern.memento; public class Player { private String status; /** * @return the status */ public String getStatus() { return status; } /** * @param status the status to set */ public void setStatus(String status) { this.status = status; } public StatusMemonto CreateMemontoStatus() { return new StatusMemonto(status); } public void setMemonto(StatusMemonto memoto){ this.status = memoto.getStatus(); } }
/*最长见于游戏状态保存,该模式不需要知道游戏具体状态,只是保存起来,等待需要的时候恢复。 * * * */ public class MementoMain extends BasicExample { @Override public void startDemo() { // TODO Auto-generated method stub Player mPlayer = new Player(); mPlayer.setStatus("Before attack Boss"); System.out.println("Plaeyr status:"+mPlayer.getStatus()); StatusTaker taker = new StatusTaker(); taker.set_mMemonto(mPlayer.CreateMemontoStatus()); mPlayer.setStatus("GameOver"); System.out.println("Plaeyr status:"+mPlayer.getStatus()); mPlayer.setMemonto(taker.get_mMemonto()); System.out.println("Plaeyr status after restore:"+mPlayer.getStatus()); } }
运行结果:
Plaeyr status:Before attack Boss
Plaeyr status:GameOver
Plaeyr status after restore:Before attack Boss
代码非常简单,但是经常会用到该模式。
该模式适用于功能比较复杂,但需要维护历史记录属性类。
当角色状态无效时,可以使用这个方式还原到有效的状态!