行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、备忘录模式的简介
■ 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;
这样,以后就可以将该对象恢复到原先保存的状态;
通俗地说,备忘录模式就是将一个对象进行备份,提供一种程序数据的备份方法;
image.png
备忘录模式3个角色:
■ 发起人(Originator)角色:
该角色记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘数据;
■ 备忘录(Memento)角色:
该角色负责存储发起人角色的内部状态,在需要时提供发起人需要的内部状态数据;
■ 负责人(Caretaker)角色:
该角色对备忘录角色进行管理、保存和提供备忘录;
/**
* 发起人角色
*/
public class Originator {
/**
* 内部状态
*/
private String state = "v1";
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
/**
* 创建备忘录
* @return
*/
public Memento createMemento(){
return new Memento(this.state);
}
/**
* 恢复一个备忘录
* @param memento
*/
public void restoreMemento(Memento memento){
this.setState(memento.getState());
}
}
/**
* 负责人角色
*/
public class Caretaker {
/**
* 备忘录对象
*/
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
/**
* 备忘录角色
*/
public class Memento {
/**
* 发起人的内部状态
*/
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
/**
* 应用代码
*/
public class Client {
public static void main(String[] args){
/**
* 定义一个发起人
*/
Originator originator = new Originator();
/**
* 定义一个负责人
*/
Caretaker caretaker = new Caretaker();
/**
* 创建一个备忘录
*/
caretaker.setMemento(originator.createMemento());
System.out.println("创建一个备忘录 state : " + caretaker.getMemento().getState());
/**
* 恢复一个备忘录
*/
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复一个备忘录 state : " + originator.getState());
}
}
# 控制台输出:
创建一个备忘录 state : v1
恢复一个备忘录 state : v1
备忘录模式的应用:
■ 需要保存和恢复数据的相关状态场景;
■ 提供一个可回滚的操作;
■ 需要监控副本的场景;
■ 数据库连接的事务管理使用的就是备忘录模式;
二、备忘录模式的实例
# 使用备忘录模式模拟版本控制系统的工作过程;
image.png
/**
* 需要被纳入版本控制系统的文档
*/
public class Document {
/**
* 需要备份的状态
*/
String content;
/**
* 不需要备份的状态
*/
String otherContent;
/**
* 保存一个备份
* @return
*/
public Backup save(){
System.out.println("保存备份");
return new Backup(content);
}
/**
* 恢复为某个状态
* @param backup
*/
public void resume(Backup backup){
System.out.println("恢复备份");
content = backup.content;
}
@Override
public String toString() {
return "Document{" +
"content='" + content + '\'' +
", otherContent='" + otherContent + '\'' +
'}';
}
}
/**
* 版本控制系统中保存的每一个备份
*/
public class Backup {
/**
* 备份的内容
*/
String content;
/**
* 版本
*/
int version;
public Backup(String content) {
this.content = content;
}
}
import java.util.LinkedList;
/**
* 版本控制系统
*/
public class VersionControlSystem {
/**
* 所有的备份
*/
LinkedList<Backup> backups = new LinkedList<>();
/**
* 下一个版本
*/
int nextVersion;
/**
* 添加备份
* @param backup
*/
public void add(Backup backup){
backup.version = ++nextVersion;
backups.add(backup);
}
/**
* 取得某个版本的备份
* @param version
* @return
*/
public Backup get(int version){
for(Backup backup : backups){
if(backup.version == version){
return backup;
}
}
return null;
}
/**
* 取得最后一个版本的备份
* @return
*/
public Backup getLastVersion(){
return backups.getLast();
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args){
VersionControlSystem vcs = new VersionControlSystem();
Document document = new Document();
System.out.println("******************");
/**
* 保存备份
*/
document.content = "content1";
document.otherContent = "otherContent1";
System.out.println(document);
vcs.add(document.save());
System.out.println("******************");
/**
* 保存备份
*/
document.content = "content2";
document.otherContent = "otherContent2";
System.out.println(document);
vcs.add(document.save());
System.out.println("******************");
/**
* 保存备份
*/
document.content = "content3";
document.otherContent = "otherContent3";
System.out.println(document);
vcs.add(document.save());
System.out.println("******************");
/**
* 恢复版本1
*/
document.resume(vcs.get(1));
System.out.println(document);
System.out.println("******************");
/**
* 恢复到最新版本
*/
document.resume(vcs.getLastVersion());
System.out.println(document);
System.out.println("******************");
}
}
# 控制台输出:
******************
Document{content='content1', otherContent='otherContent1'}
保存备份
******************
Document{content='content2', otherContent='otherContent2'}
保存备份
******************
Document{content='content3', otherContent='otherContent3'}
保存备份
******************
恢复备份
Document{content='content1', otherContent='otherContent3'}
******************
恢复备份
Document{content='content3', otherContent='otherContent3'}
******************
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论