拥有乐观的心态很重要,它能让工作和生活更加美好。
一、备忘录模式简介
备忘录模式是设计模式中行为型模式的一种。备忘录模式用于保存对象的状态,以便于在合适的时候恢复对象。
备忘录模式使用三个角色:Memento(备忘)、Originator(发起者)、Caretaker(备忘管理者)。
二、适应场景
- 需要保存/恢复数据的相关场景。
- 提供一个可回滚的操作。
例如:游戏存档、windows 系统的 ctrl + z 、数据库的事务等。
三、示例演示
示例演示了广告牌保存历史修改状态,可以恢复历史广告内容。
Billboard(广告牌):
/**
* 广告牌
*
* @author ZhengNC
* @date 2020/9/22 10:48
*/
public class Billboard {
/**
* 广告牌内容
*/
private String content;
public Billboard(String content){
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
/**
* 显示广告牌内容
*/
public void display(){
System.out.println(content);
}
/**
* 保存当前状态
*/
public BillboardMemento saveState(){
return new BillboardMemento(content);
}
/**
* 恢复之前保存的状态
*
* @param memento
*/
public void recoverState(BillboardMemento memento){
if (memento != null){
this.content = memento.getContent();
}else {
System.out.println("没有历史记录");
}
}
}
BillboardMemento(广告牌备忘):
/**
* 广告牌备忘
*
* @author ZhengNC
* @date 2020/9/22 11:00
*/
public class BillboardMemento {
private String content;
public BillboardMemento(String content){
this.content = content;
}
public String getContent(){
return content;
}
}
BillboardCaretaker(备忘录管理者):
import java.util.EmptyStackException;
import java.util.Stack;
/**
* 备忘录管理者
*
* @author ZhengNC
* @date 2020/9/22 11:03
*/
public class BillboardCaretaker {
private Stack<BillboardMemento> mementos = new Stack<>();
public BillboardMemento get(){
try {
return mementos.pop();
}catch (EmptyStackException e){
return null;
}
}
public void add(BillboardMemento memento){
mementos.push(memento);
}
}
四、测试示例
TestMemento(测试备忘录模式):
/**
* 测试备忘录模式
*
* @author ZhengNC
* @date 2020/9/22 11:13
*/
public class TestMemento {
public static void main(String[] args) {
//创建广告牌
Billboard billboard = new Billboard("全场七折!");
//显示广告内容
billboard.display();
//创建广告牌备忘录管理者
BillboardCaretaker caretaker = new BillboardCaretaker();
//保存广告牌当前状态
caretaker.add(billboard.saveState());
//修改广告内容
billboard.setContent("全场六折!");
//显示广告内容
billboard.display();
//保存广告牌当前状态
caretaker.add(billboard.saveState());
//修改广告内容
billboard.setContent("全场一折!");
//显示广告内容
billboard.display();
//恢复上一次修改的状态
billboard.recoverState(caretaker.get());
//显示广告内容
billboard.display();
//恢复上上一次修改的状态
billboard.recoverState(caretaker.get());
//显示广告内容
billboard.display();
}
}
输出结果:
全场七折!
全场六折!
全场一折!
全场六折!
全场七折!