概念
备忘录模式就是用来保存一种状态的,能够在不破坏封装性的前提下,实现对象状态的保存和恢复工作。保存对象的状态是为了以后在需要的时候快速恢复到保存时的状态,通常与命令模式同时使用,那么就可以进行某些命令的恢复操作,恢复到修改之前的某一个状态中。
实现
案例:包租婆有一个小本本用来记录每个租客的租金缴纳情况
首先我们来定义一个小本本,专门用于记录缴纳情况的:
/**
* 定义一个包租婆的备忘录
* 用于记录每个租客的租金缴纳状态的
*/
public class Memento {
//定义一个属性,用于记录每个租客的名字
private String name;
//定义一个属性,用于记录是否已经缴纳租金
private boolean isPay;
public Memento(String name, boolean isPay) {
this.name = name;
this.isPay = isPay;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isPay() {
return isPay;
}
public void setPay(boolean pay) {
isPay = pay;
}
}
接下来我们定义租客这个类
/**
* 定义租客的类,用于表示是否已经缴纳租金
*/
public class Tenants {
//租客名字
private String name;
//租客是否已经缴纳租金
private boolean state;
public Tenants(String name, boolean state) {
this.name = name;
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean getState(){
return state;
}
public void setState(boolean state) {
this.state = state;
}
//保存租客缴费记录
public Memento save(){
return new Memento(name,state);
}
//租客查询自己缴费记录
public void getStateFromMemento(Memento memento){
state = memento.isPay();
}
}
有小本本记录,那也得有它的持有者——包租婆呀
/**
* 定义包租婆
*/
public class BaoZuPo {
//展现包租婆的实力,拿出一本备忘录,记录所有租客的信息
private List<Memento> list = new ArrayList<>();
//每当有一个租客搬进来,就要添加
public void add(Memento memento){
list.add(memento);
}
//同样的搬走一个租客,就要扔掉这个备忘录
public void remove(Memento memento){
list.remove(memento);
}
//获取备忘录上第i个租客的缴费信息
public Memento get(int i){
return list.get(i);
}
}
月初了,包租婆要进行收租工作了:
/**
* 每到月初,包租婆就要拿起她的小本本了
*/
public class Begin {
public static void main(String[] args) {
//定义租客ctb,月初没钱
Tenants t1 = new Tenants("ctb",false);
//定义小明,懒皮
Tenants t2 = new Tenants("小明",false);
//定义小小,缴过租金了
Tenants t3 = new Tenants("小小",true);
//包租婆开始记录了
BaoZuPo baoZuPo = new BaoZuPo();
baoZuPo.add(t1.save());
baoZuPo.add(t2.save());
baoZuPo.add(t3.save());
//租金缴纳情况
System.out.println(t1.getName() +"是否已经交租金了," + t1.getState());
System.out.println(t2.getName() +"是否已经交租金了," + t2.getState());
System.out.println(t3.getName() +"是否已经交租金了," + t3.getState());
System.out.println("过去两天");
//两天后,老板终于发人工了,我有钱交房租了
t1.setState(true);
System.out.println(t1.getName() +"是否已经交租金了," + t1.getState());
//包租婆查看两天前记录
t1.getStateFromMemento(baoZuPo.get(0));
System.out.println(t1.getName() +"两天前是否已经交租金" + t1.getState());
}
}
实验结果:
优点:给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态,实现了信息的封装,使得用户不需要关心状态的保存细节
缺点:消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
参考文案:https://www.runoob.com/design-pattern/memento-pattern.html
本文的代码:https://pan.baidu.com/s/1wieoVS85aSwQpBLGjpbQ6Q
提取码:tvc5