设计模式之备忘录模式
2023-12-25 本文已影响0人
久伴我还是酒伴我
简介
听起来特别高深,其实模式名称已经很形象的反映出其作用了:就是为了在某一时刻把当前的状态记录下来,以后再恢复到那时的状态。
类型
行为型(behavioral)
场景
在不破坏封闭的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以将对象恢复到原先保存的状态。
正在开发一个功能,这个功能需要存档的时候就应该想到它。例如游戏,文档编辑器等等,都需要在你下次重新打开的时候恢复到你关闭它时候的状态。
结构
备忘录模式有3个角色
Originator: 发起人
我们知道备忘录模式就是要完成保存状态,然后恢复状态的功能。那么保存和恢复谁的状态呢?对了,就是这个角色的状态。
Memento: 备忘录
这个就比较简单了,就是一个存储状态的类,里面没有业务逻辑,一般是一个POJO。
CareTaker: 管理者
负责保存和恢复Originator的状态,状态是保存在这类里面的。
发起人
package com.glj.webservice.demo.designPattern.Memento;
/**
* 发起人
*/
public class WordOriginator {
private int wordCount;
public WordProgressMemento saveProcess() {
return new WordProgressMemento(wordCount);
}
public void restoreProcess(WordProgressMemento memento) {
wordCount = memento.getCount();
}
//编辑文档
public void editWord() {
System.out.println("------------------开始编辑文档------------------");
System.out.println("当前字数为:"+ wordCount);
System.out.println("多写1个字");
wordCount++;
System.out.println(String.format("总字数为:%d", wordCount));
}
//退出编辑
public void exitWord(){
System.out.println("退出编辑");
wordCount = 0;
System.out.println("-----------------退出编辑-------------------");
}
}
备忘录
基本上就是一个POJO。它不包含业务逻辑,只包含数量数据,结构有要保存的状态类决定。
package com.glj.webservice.demo.designPattern.Memento;
/**
* 备忘录
*/
public class WordProgressMemento {
private int count;
public WordProgressMemento(int count) {
this.count = count;
}
public int getCount() {
return count;
}
}
管理者
管理者相对于发起人来说是一个外部组件,它帮助发起人保存了数量,相当于发起人将自己某一个时刻的数量保存到了外部。
当我们要保存数量时,使用此类的saveMemento。当我们要恢复状态时,使用此类的getMemento
package com.glj.webservice.demo.designPattern.Memento;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* 管理者
*/
public class WordCareTaker {
public List<WordProgressMemento> memento= new ArrayList<>();
public void saveMemento(WordProgressMemento memento) {
this.memento.add(memento);
}
public WordProgressMemento getMemento(int index) {
return this.memento.get(index);
}
}
客户端使用
package com.glj.webservice.demo.designPattern;
import com.glj.webservice.demo.designPattern.Memento.WordCareTaker;
import com.glj.webservice.demo.designPattern.Memento.WordOriginator;
import com.glj.webservice.demo.designPattern.strategy.CashContext;
public class PatternTest {
public static void main(String[] args) {
//备忘录模式
WordOriginator originator = new WordOriginator();
WordCareTaker careTaker = new WordCareTaker();
for (int i = 0; i < 5; i++) {
if(i >0){
//重新打开编辑,恢复进度
originator.restoreProcess(careTaker.getMemento(i-1));
}
originator.editWord();
//保存进度
careTaker.saveMemento(originator.saveProcess());
//退出编辑
originator.exitWord();
}
// //开始编辑word
// originator.editWord();
// //点击保存 保存进度
// careTaker.saveMemento(originator.saveProcess());
// //退出编辑
// originator.exitWord();
//
// //重新打开编辑,恢复进度
// originator.restoreProcess(careTaker.getMemento(careTaker.memento.size()-1));
// originator.editWord();
//
// //保存进度
// careTaker.saveMemento(originator.saveProcess());
// //退出编辑
// originator.exitWord();
//
// //重新打开编辑,恢复进度
// originator.restoreProcess(careTaker.getMemento(careTaker.memento.size()-1));
// originator.editWord();
}
}
输出结果
------------------开始编辑文档------------------
当前字数为:0
多写一个字
总字数为:1
退出编辑
-----------------退出编辑-------------------
------------------开始编辑文档------------------
当前字数为:1
多写一个字
总字数为:2
退出编辑
-----------------退出编辑-------------------
------------------开始编辑文档------------------
当前字数为:2
多写一个字
总字数为:3
退出编辑
-----------------退出编辑-------------------
------------------开始编辑文档------------------
当前字数为:3
多写一个字
总字数为:4
退出编辑
-----------------退出编辑-------------------
------------------开始编辑文档------------------
当前字数为:4
多写一个字
总字数为:5
退出编辑
-----------------退出编辑-------------------