一、什麼是備忘錄模式
Memento模式也叫備忘錄模式,是行為模式之一,它的作用是儲存對象的内部狀态,并在需要的時候(undo/rollback)恢複對象以前的狀态。
二、備忘錄模式的應用場景
如果一個對象需要儲存狀态并可通過undo或rollback等操作恢複到以前的狀态時,可以使用Memento模式。
1)一個類需要儲存它的對象的狀态(相當于Originator角色)
2)設計一個類,該類隻是用來儲存上述對象的狀态(相當于Memento角色)
3)需要的時候,Caretaker角色要求Originator傳回一個Memento并加以儲存
4)undo或rollback操作時,通過Caretaker儲存的Memento恢複Originator對象的狀态
三、備忘錄模式的結構
四、備忘錄模式的角色和職責
Originator(原生者)
需要被儲存狀态以便恢複的那個對象。
Memento(備忘錄)
該對象由Originator建立,主要用來儲存Originator的内部狀态。
Caretaker(管理者)
負責在适當的時間儲存/恢複Originator對象的狀态。
沒有使用備忘錄模式的例子:
Person.java
public class Person {
//姓名
private String name;
//性别
private String sex;
//年齡
private int age;
public Person() {
}
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void display() {
System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
}
}
MainClass.java
public class MainClass {
public static void main(String[] args) {
Person per = new Person("lifengxing","男",30);
//儲存内部狀态
Person backup = new Person();
backup.setName(per.getName());
backup.setAge(per.getAge());
backup.setSex(per.getSex());
per.display();
//修改
per.setAge(20);
per.display();
//復原 還原
per.setName(backup.getName());
per.setSex(backup.getSex());
per.setAge(backup.getAge());
per.display();
}
}
使用了備忘錄模式的例子:
//Person.java
package com.ibeifeng.ex2;
public class Person {
//姓名
private String name;
//性别
private String sex;
//年齡
private int age;
public Person() {
}
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void display() {
System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
}
//建立一個備份
public Memento createMemento() {
return new Memento(name,sex,age);
}
//恢複備份,還原
public void setMemento(Memento memento) {
this.name = memento.getName();
this.sex = memento.getSex();
this.age = memento.getAge();
}
}
//Caretaker.java
package com.ibeifeng.ex2;
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
//Memento.java
package com.ibeifeng.ex2;
public class Memento {
// 姓名
private String name;
// 性别
private String sex;
// 年齡
private int age;
public Memento(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//MainClass.java
package com.ibeifeng.ex2;
public class MainClass {
public static void main(String[] args) {
Person per = new Person("lifengxing","男",24);
// Memento memento = per.createMemento();
Caretaker caretaker = new Caretaker();
caretaker.setMemento(per.createMemento());
per.display();
per.setName("beifeng");
per.setSex("女");
per.setAge(1);
per.display();
per.setMemento(caretaker.getMemento());
per.display();
}
}