1.定义
可以使对象可以返回到之前的状态,如撤销操作、或者学习系统上记住之前的学习状态等
2.使用场景及设计
2.1.使用场景
常用在系统中保存用户之前的状态及游戏的存档等。
2.2.设计
类图如下,其中Memento类用来保存状态,ManageMemento用来存取档,Client为客户端
3.测试代码
入口代码
package com.glt.designpattern.Memento;
public class InitMain {
public static void main(String[] args) {
Client c = new Client();
c.startGame(null);
c.player("1");
c.player("2");
Memento memento = c.exitGame();//退出
ManageMemento.setMemento(memento);//存档
Client c2 = new Client();
c2.startGame(ManageMemento.getMemento());//加载档案
c2.showPlayer();
c2.player("5");
}
}
备忘录类
package com.glt.designpattern.Memento;
/**
* 备忘录类
*/
public class Memento {
private String status;
public String getCurrStatus(){
return status;
}
public void saveStatus(String curr){
this.status = curr;
}
}
备忘录管理类,此种方式只能存放一个状态,使用集合可以存档多种状态
package com.glt.designpattern.Memento;
/**
* 备忘录管理类,用来记录存档与获取
*/
public class ManageMemento {
static Memento memento;
public static Memento getMemento() {
return memento;
}
public static void setMemento(Memento m) {
memento = m;
}
}
package com.glt.designpattern.Memento;
public class Client {
Memento memento;
public void startGame(Memento m){
this.memento = m;
if(memento==null){
memento = new Memento();
}
System.out.println(" init LastStatus " + memento.getCurrStatus());
}
public void showPlayer(){
System.out.println(" current player stats : " + memento.getCurrStatus());
}
public void player(String s){
memento.saveStatus(s);
System.out.println(" player currStatus " + memento.getCurrStatus());
}
public Memento exitGame(){
if(memento==null){
memento = new Memento();
}
return memento;
}
}
输出如下
init LastStatus null
player currStatus 1
player currStatus 2
init LastStatus 2
current player stats : 2
player currStatus 5
Process finished with exit code 0
4.总结
优点:
- 存储关键对象的重要状态
- 可以通过备忘录实现用户撤销等
缺点:
成员对象多,如果备忘录过大会很消耗资源