备忘录模式
2018-11-17 本文已影响0人
南谭一隅
一、定义
备忘录模式(Memento Pattern):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对对象恢复到以前的状态。--百度百科
重点:
1、这是一种行为模式
2、不破坏封闭性
3、保存的是对象的内部状态
4、在对象之外保存状态
二、简单示例
1、不用设计模式的情况
有一个student对象,代码如下:
package com.hqzmss.memento.useless;
public class Student {
private String name;
private boolean sex;
private int age;
//以下是一些getter和setter方法
public String getName() {return name;}
public void setName(String name) {this.name = name; }
public boolean isSex() {return sex;}
public void setSex(boolean sex) {this.sex = sex;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age; }
}
然后在一个类中需要对其进行操作,如下:
package com.hqzmss.memento.useless;
public class MainClass {
public static void main(String[] args) {
Student student = new Student();
student.setName("hqz");
student.setAge(20);
student.setSex(true);
//保存原对象的状态信息(此操作与此类的职责无关)
Student save = new Student();
save.setAge(student.getAge());
save.setName(student.getName());
save.setSex(student.isSex());
//修改原对象(这里才是此类应有的职责)
student.setAge(10);
student.setName("li");
student.setSex(false);
//恢复原对象的状态信息(此操作与此类的职责无关)
student.setAge(save.getAge());
student.setName(save.getName());
student.setSex(save.isSex());
}
}
说明:
这里实现的功能跟备忘录实现的功能是一样的,在对Student进行操作的时候,我们可能需要把该对象的状态暂存,然后在适当的时候进行恢复。
弊端:
a、违反了单一职责原则。因为保存原对象的状态信息并不是main方法所要做的事情。
b、导致很多重复代码。当在很多地方需要保存/恢复对象信息的时候需要写很多重复代码
2、使用备忘录模式的情况
a、在原对象中加入两个方法:
package com.hqzmss.memento.use;
public class Student {
private String name;
private boolean sex;
private int age;
/**
* 创建并返回一个新的备忘录
* @return 新的备忘录
*/
public Memento createMemento() {
return new Memento(name, age, sex);
}
/**
* 使用一个备忘录恢复原对象
* @param memento 备忘录
*/
public void restoreMemento(Memento memento) {
this.name = memento.getName();
this.sex = memento.isSex();
this.age = memento.getAge();
}
public String getName() {return name;}
public void setName(String name) { this.name = name;}
public boolean isSex() {return sex;}
public void setSex(boolean sex) { this.sex = sex;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
}
b、新建一个备忘录对象
package com.hqzmss.memento.use;
/**
*此类便是备忘录了,这里存储的是Student类里的部分或全部状态
*/
public class Memento {
private String name;
private int age;
private boolean sex;
public Memento(String name, int age, boolean sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() { return age;}
public void setAge(int age) {this.age = age;}
public boolean isSex() {return sex;}
public void setSex(boolean sex) { this.sex = sex;}
}
c、新建一个负责人对象,此对象负责存储备忘录
package com.hqzmss.memento.use;
/**
* 负责人,此类负责创建或获取一个备忘录
*/
public class Caretaker {
private Memento memento;
public Memento getMemento() { return memento;}
public void setMemento(Memento memento) {this.memento = memento;}
}
d、main函数备份对象信息时采用如下方式
package com.hqzmss.memento.use;
public class MainClass {
public static void main(String[] args) {
Student student = new Student();
student.setName("hqz");
student.setAge(9);
student.setSex(true);
Caretaker caretaker = new Caretaker();
//创建备忘录
caretaker.setMemento(student.createMemento());
//修改原对象信息
student.setName("123");
//恢复原对象的状态信息
student.restoreMemento(caretaker.getMemento());
}
}
至此,一个简单的备忘录模式就完成了。
三、专业术语
- Memento:备忘录
- Originator:原发器(对应上例中的Student)
- Caretaker:负责人