备忘录模式
使用备忘录模式的情景: 一般用于版本的回退, 页面上临时配置的回退等操作.
备忘录模式实战模拟记录各个版本配置信息, 并实现配置的回退, 前进等操作.
uml图如下 配置信息类
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ConfigFile {
// 版本号
private String versionNo;
// 内容
private String content;
// 时间
private Date dateTime;
// 操作人
private String operator;
}
备忘录类
/**
* 类名称:ConfigMemento
* 备忘录类
* 创建时间:2022/3/31 20:15
* 对原有配置类的扩展,可以设置和获取配置信息。
*/
@Data
public class ConfigMemento {
private ConfigFile configFile;
public ConfigMemento(ConfigFile configFile) {
this.configFile = configFile;
}
}
记录者类
@Data
public class ConfigOriginator {
private ConfigFile configFile;
public ConfigMemento saveMemento() {
// 保存备忘录的时候会创建一个备忘录信息,并返回回去,交给管理者处理。
return new ConfigMemento(configFile);
}
public void getMemento(ConfigMemento memento) {
// 把备忘录的信息交给现在的配置文件
this.configFile = memento.getConfigFile();
}
}
管理员类 Admin 实现数据的回滚 存放 等操作.
public class Admin {
private int cursorIdx = 0;
private List mementoList = new ArrayList();
private Map mementoMap = new ConcurrentHashMap();
// 存放
public void append(ConfigMemento memento) {
mementoList.add(memento);
mementoMap.put(memento.getConfigFile().getVersionNo(), memento);
// 每加一次 游标加一
cursorIdx++;
}
// 回滚
public ConfigMemento undo() {
if ( --cursorIdx mementoList.size()) return mementoList.get(mementoList.size() - 1);
return mementoList.get(cursorIdx);
}
//定向获取
public ConfigMemento get(String versionNo) {
return mementoMap.get(versionNo);
}
}
测试类:
import com.alibaba.fastjson.JSON;
import com.thc.design.Admin;
import com.thc.design.ConfigFile;
import com.thc.design.ConfigOriginator;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
/**
* 类名称:ApiTest
* 创建时间:2022/3/31 20:44
*/
public class ApiTest {
private Logger logger = LoggerFactory.getLogger(ApiTest.class);
@Test
public void test() {
Admin admin = new Admin();
ConfigOriginator configOriginator = new ConfigOriginator();
configOriginator.setConfigFile(new ConfigFile("1000001", "配置内容A1", new Date(), "搬砖工"));
// 保存配置
admin.append(configOriginator.saveMemento());
configOriginator.setConfigFile(new ConfigFile("1000002", "配置内容A2", new Date(), "搬砖工"));
admin.append(configOriginator.saveMemento());
configOriginator.setConfigFile(new ConfigFile("1000003", "配置内容A3", new Date(), "搬砖工"));
admin.append(configOriginator.saveMemento());
configOriginator.setConfigFile(new ConfigFile("1000004", "配置内容A4", new Date(), "搬砖工"));
admin.append(configOriginator.saveMemento());
// 历史配置 回滚
configOriginator.getMemento(admin.undo());
logger.info("历史配置(回滚) undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));
// 历史配置回滚
configOriginator.getMemento(admin.undo());
logger.info("历史配置回滚 undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));
configOriginator.getMemento(admin.undo());
logger.info("历史配置回滚 undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));
configOriginator.getMemento(admin.undo());
logger.info("历史配置回滚 undo: {}", JSON.toJSONString(configOriginator.getConfigFile()));
// 历史配置 前进
configOriginator.getMemento(admin.redo());
logger.info("历史配置前进 redo:{}", JSON.toJSONString(configOriginator.getConfigFile()));
// 历史配置 直接获取
configOriginator.getMemento(admin.get("1000002"));
logger.info("历史配置(获取) get:{}", JSON.toJSONString(configOriginator.getConfigFile()));
}
}
控制台打印如下 . 对备忘录进行回滚, 前进 以及直接获取等操作.
22:21:38.999 [main] INFO com.thc.design.test.ApiTest - 历史配置(回滚) undo: {"content":"配置内容A3","dateTime":1648736498880,"operator":"搬砖工","versionNo":"1000003"}
22:21:39.003 [main] INFO com.thc.design.test.ApiTest - 历史配置回滚 undo: {"content":"配置内容A2","dateTime":1648736498880,"operator":"搬砖工","versionNo":"1000002"}
22:21:39.003 [main] INFO com.thc.design.test.ApiTest - 历史配置回滚 undo: {"content":"配置内容A1","dateTime":1648736498879,"operator":"搬砖工","versionNo":"1000001"}
22:22:07.998 [main] INFO com.thc.design.test.ApiTest - 历史配置回滚 undo: {"content":"配置内容A1","dateTime":1648736498879,"operator":"搬砖工","versionNo":"1000001"}
22:22:07.998 [main] INFO com.thc.design.test.ApiTest - 历史配置前进 redo:{"content":"配置内容A1","dateTime":1648736498879,"operator":"搬砖工","versionNo":"1000001"}
22:22:07.999 [main] INFO com.thc.design.test.ApiTest - 历史配置(获取) get:{"content":"配置内容A2","dateTime":1648736498880,"operator":"搬砖工","versionNo":"1000002"}