浅谈设计模式-备忘录模式

书接上回,本篇讲一下行为型模式-备忘录模式
备忘录模式
定义:在不破坏代码封装性的前提下,获取一个对象的内部状态并保存,后续可以将该对象恢复到原先保存的状态 。
UML图
:备忘录 。用来存储原发器()对象内部状态 。可以使接口,也是是一个类 。里面的方法,属性都是由原发器()对象内部状态决定,它是个被动接收方 。并约定,该接口/类只允许原发器()对象访问 。
:原发器 。普通业务类,当需要存储当前时刻运行状态时,可以使用备忘录类记录下当前时刻状态,也可以在未来某个时刻恢复当前状态 。
:备忘录管理者,当原发器()保存很多备忘录时,可以使用类对众多备忘录对象进行管理 。需要注意的是:管理者只有管理备忘录的功能,无法操作备忘录对象功能(比如查看备忘录内容等)
/*** 备忘录接口* 也可以是一个类,这里以接口方式讲解*/public interface IMemento {/*** 显示备忘录信息*/void info();}
/*** 原发器:* 创建备忘录的地方* 触发保存备忘对象的地方*/public class Originator {private String state;//初始化状态//创建备忘录public IMemento createMemento(){return new MementoImpl(this.state);}//恢复Originator 原发器状态public void setMemento(IMemento memento){MementoImpl mi = (MementoImpl) memento;this.state = mi.state;}//备忘录实现对象,里面属性跟Originator 一样,用于缓存Originator对象状态privateclassMementoImpl implements IMemento{private String state;@Overridepublic void info() {System.out.println("备忘录状态:" + state);}public MementoImpl(String state){this.state = state;}}public void setState(String state) {this.state = state;}public String getState() {return state;}}
/*** 备忘录管理者*/public class Caretaker {//维护所有备忘录对象private List mementos = new ArrayList<>();public void addMemento(IMemento memento){mementos.add(memento);}public IMemento retriveMemento(){if(mementos.size() > 0){return mementos.remove(mementos.size() - 1);}return null;}public void showMemento(){mementos.forEach(IMemento::info);}}
【浅谈设计模式-备忘录模式】测试
public class App {public static void main(String[] args) {//原发器Originator originator = new Originator();//备份录管理器Caretaker caretaker = new Caretaker();//一系列操作后,原发器设置状态1originator.setState("state1");//备份1caretaker.addMemento(originator.createMemento());System.out.println("当前原发器状态:" + originator.getState() + ", 备份");//又一系列操作后,原发器设置状态2originator.setState("state2");caretaker.addMemento(originator.createMemento());System.out.println("当前原发器状态:" + originator.getState() + ", 备份");//又一系列操作后,原发器设置状态3originator.setState("state3");caretaker.addMemento(originator.createMemento());System.out.println("当前原发器状态:" + originator.getState() + ", 备份");//遍历备忘录集合caretaker.showMemento();//恢复备忘录....................originator.setMemento(caretaker.retriveMemento());System.out.println("第一次恢复备忘录,原发器状态:" + originator.getState());originator.setMemento(caretaker.retriveMemento());System.out.println("第二次恢复备忘录,原发器状态:" + originator.getState());originator.setMemento(caretaker.retriveMemento());System.out.println("第三次恢复备忘录,原发器状态:" + originator.getState());}}
结果:
当前原发器状态:state1, 备份当前原发器状态:state2, 备份当前原发器状态:state3, 备份备忘录状态:state1备忘录状态:state2备忘录状态:state3第一次恢复备忘录,原发器状态:state3第二次恢复备忘录,原发器状态:state2第三次恢复备忘录,原发器状态:state1