- 备忘录模式
备忘录模式又叫做快照模式,是对象的行为模式。备忘录模式中的备忘录对象是一个用来存储另一个对象内部快照的对象。备忘录模式的定义是在不破坏封装的条件下,捕获一个对象的内部状态,并且在该对象外部外保存起来,从而实现可以在适当的时候将这个对象还原到原来存储的状态。就相当于快捷键Ctrl+Z。例如我们日常下围棋的时候悔棋,玩游戏时候的存档都是备忘录模式。 - 备忘录模式中的角色
- 备忘录角色:负责存储发起人角色对象的内部状态,备忘录角色可以根据发起人对象的判断来决定存储多少发起人角色的内部状态;可以保护其内容不背发起人角色之外的任何角色读取。
- 发起人角色:创建一个备忘录角色,用于记录当前时刻自身的内部状态,并且可以使备忘录角色回复内部状态。
- 负责人角色:负责保存备忘录角色,但是并不能访问或者改变备忘录角色的内容。
-
备忘录角色的示意图
-
备忘录角色的实例代码
场景:下围棋的时候悔棋。
负责人角色:
public class CareTaker {
private HashMap<String,MementoIF> hashMap ;
public CareTaker() {
this.hashMap = new HashMap<>();
}
public HashMap<String, MementoIF> getHashMap() {
return hashMap;
}
public void setHashMap(HashMap<String, MementoIF> hashMap) {
this.hashMap = hashMap;
}
/**
* 创建备忘录
* @param name
* @param mementoIF
*/
public void createMemento(String name,MementoIF mementoIF){
this.hashMap.put(name,mementoIF);
}
/**
* 读取备忘录存档
* @param name
* @return
*/
public MementoIF readMemento(String name){
return this.hashMap.get(name);
}
}
备忘录角色接口:
public interface MementoIF {
}
备忘录角色和发起人角色:
public class ChessPlayerOne {
private HashMap<String,String > status;
public ChessPlayerOne() {
this.status = new HashMap<>();
}
public MementoIF create(){
return new Memento(status);
}
public void read(MementoIF mementoIF){
status = ((Memento)mementoIF).getStatus();
}
public void stepOne(){
status.put("x","8");
status.put("Y","10");
}
public void stepTwo(){
status.put("x","18");
status.put("Y","20");
}
public void stepThree(){
status.put("x","88");
status.put("Y","88");
}
public void show(){
System.out.println(">>>>>>>>>>>>>>>>>>>"+status.toString());
}
/**
* 备忘录角色
*/
private class Memento implements MementoIF{
private HashMap<String,String > status;
public Memento(HashMap<String, String> status) {
this.status = new HashMap<>(status);
}
public HashMap<String, String> getStatus() {
return status;
}
public void setStatus(HashMap<String, String> status) {
this.status = status;
}
}
}
测试主函数:
public class Main {
public static void main(String[] args) {
CareTaker careTaker = new CareTaker();
ChessPlayerOne chessPlayerOne = new ChessPlayerOne();
chessPlayerOne.stepOne();
careTaker.createMemento("stepOne",chessPlayerOne.create());
chessPlayerOne.show();
chessPlayerOne.stepTwo();
chessPlayerOne.show();
careTaker.createMemento("stepTwo",chessPlayerOne.create());
chessPlayerOne.read (careTaker.readMemento("stepOne"));
chessPlayerOne.show();
chessPlayerOne.stepThree();
chessPlayerOne.show();
}
}
- 备忘录模式的优缺点
优点:
给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源比较多,每次保存都会消耗内存。