一、場(chǎng)景
- 錄入大批人員資料。正在錄入當(dāng)前資料時(shí),發(fā)現(xiàn)上一個(gè)錄錯(cuò)了,此時(shí)需要回復(fù)上一個(gè)資料,再進(jìn)行修改
-
word文檔編輯時(shí),忽然電腦死機(jī)了,再打開(kāi)時(shí),可以看到word提示你回復(fù)到以前的文檔 - 管理系統(tǒng)中,公文撤回功能。公文發(fā)送出去后,想車回來(lái)
二、核心
就是保存某個(gè)對(duì)象內(nèi)部狀態(tài)的拷貝,這樣以后就可以將該對(duì)象回復(fù)到原先的狀態(tài)
三、結(jié)構(gòu)
- 源發(fā)器類
Originatot - 備忘錄類
Memento - 負(fù)責(zé)人類
CareTaker
Emp.java
package cn.itcast.day253.memento;
//源發(fā)器類
public class Emp {
private String name ;
private int age ;
private double salary;
//備忘操作,并返回備忘錄對(duì)象
public EmpMemento memento(){
return new EmpMemento(this);
}
//數(shù)據(jù)回復(fù),回復(fù)成指定備忘錄的值
public void recovery(EmpMemento mmt){
this.name = mmt.getName();
this.age = mmt.getAge();
this.salary = mmt.getSalary();
}
public Emp(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
EmpMemento.java
package cn.itcast.day253.memento;
//備忘錄類:保存源發(fā)器類中的相關(guān)信息
public class EmpMemento {
private String name ;
private int age ;
private double salary;
public EmpMemento(Emp e){
this.name = e.getName();
this.age = e.getAge();
this.salary = e.getSalary();
}
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
CareTaker.java
package cn.itcast.day253.memento;
//負(fù)責(zé)人類:負(fù)責(zé)管理備忘錄對(duì)象
public class CareTaker {
private EmpMemento memento;//當(dāng)然這里我們也可以是一個(gè)容器,這樣就可以存儲(chǔ)很多個(gè)備忘點(diǎn),最好是一個(gè)棧
public EmpMemento getMemento() {
return memento;
}
public void setMemento(EmpMemento memento) {
this.memento = memento;
}
}
說(shuō)明:一個(gè)源發(fā)器類用來(lái)保存我們操作對(duì)象的信息,而備忘錄類就是保存我們操作過(guò)程中的一些狀態(tài)信息,同時(shí)有一個(gè)負(fù)責(zé)人類專門來(lái)管理備忘錄類,用來(lái)撤銷等操作。
Client.java
package cn.itcast.day253.memento;
public class Client {
public static void main(String[] args) {
CareTaker taker = new CareTaker();
Emp emp = new Emp("yj", 26, 12000);
System.out.println("第一次:" + emp.getName() + ",年齡:" + emp.getAge()
+ ",工資:" + emp.getSalary());
taker.setMemento(emp.memento());//備份
emp.setAge(27);
emp.setSalary(21000);
System.out.println("第二次:" + emp.getName() + ",年齡:" + emp.getAge()
+ ",工資:" + emp.getSalary());
emp.recovery(taker.getMemento());//恢復(fù)
System.out.println("第三次:" + emp.getName() + ",年齡:" + emp.getAge()
+ ",工資:" + emp.getSalary());
}
}
四、開(kāi)發(fā)中常見(jiàn)的場(chǎng)景
- 棋類游戲中,悔棋
- 普通軟件中,撤銷操作
- 數(shù)據(jù)庫(kù)軟件中,事物管理中的回滾操作