Java中的23個設計模式 【行為型模式】 中的 【備忘錄模式】
阿新 • • 發佈:2021-02-19
文章目錄
設計模式分類
- 建立型模式
- 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式
- 關注物件的建立過程
- 結構型模式
- 介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式
- 關注物件和類的組織
- 行為型模式
- 模板方法模式、
命令模式、迭代器模式、觀察者模式、中介模式、備忘錄模式、直譯器模式、狀態模式、策略模式、責任鏈模式、訪問者模式- 關注系統同對象之間的相互互動,研究系統在執行時物件之間的相互通訊和協作,進一步明確物件的職責
備忘錄模式(memento)
場景
- 錄入大批人員資料。正在錄入當前人資料時,發現上一個人錄錯了,此時需要恢復上一個人的資料,再進行修改
- Word文件編輯時,突然電腦宕機或斷電,再開啟時,可以看到Word提示你恢復到以前的文件
- 管理系統中,公文撤回功能。公文傳送出去後,想撤回來
核心
- 就是儲存某個物件內部狀態的拷貝,這樣以後就可以將該物件恢復到原先的狀態
結構
- 源發器類Originator——儲存物件內部狀態
- 備忘錄類Memento——儲存拷貝狀態
- 負責人類CareTaker——儲存備忘錄
開發中常見的應用場景
- 棋類遊戲中的,悔棋操作
- 普通軟體中的,撤銷操作
- 資料庫軟體中的,事務管理中的,回滾操作
- Photoshop軟體中的,歷史記錄
程式碼
案例:員工資訊的備份和恢復
- 源發器類(員工類,包括備份、恢復方法)
- 備忘錄類(員工類的一個克隆模板,構造方法傳入員工,對內容進行備份)
- 負責人類(管理備忘錄物件)
源發器類(員工類)
package memento;
/**
* 源發器類
* @author sxhDrk
*
*/
public class Emp {
private String ename;
private int age;
private double salary;
//進行備忘錄操作,並返回備忘錄物件
public EmpMemento memento() {
return new EmpMemento (this);
}
//進行資料恢復,恢復成指定備忘錄物件的值
public void recovery(EmpMemento mmt) {
this.ename = mmt.getEname();
this.age = mmt.getAge();
this.salary = mmt.getSalary();
}
public Emp(String ename, int age, double salary) {
super();
this.ename = ename;
this.age = age;
this.salary = salary;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
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;
}
}
備忘錄類
package memento;
/**
* 備忘錄類
* @author sxhDrk
*
*/
public class EmpMemento {
private String ename;
private int age;
private double salary;
public EmpMemento(Emp e) {//備份操作
this.ename = e.getEname();
this.age = e.getAge();
this.salary = e.getSalary();
}
public EmpMemento(String ename, int age, double salary) {
super();
this.ename = ename;
this.age = age;
this.salary = salary;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
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;
}
}
負責人類
- 可以通過增加容器,設定多個備忘點
private List<EmpMemento> list = new ArrayList<EmpMemento>();
public class CareTaker{ private EmpMemento memento; private List<EmpMemento> list = new ArrayList<EmpMemento>();//通過容器新增多個備忘點 public EmpMemento getMemento() { return memento; } public void setMemento(EmpMemento memento) { this.memento = memento; } }
備忘點較多時
- 將備忘錄壓棧
private Stack<Memento> stack = new Stack<Memento>();
public class CareTaker{ private Memento memento; private Stack<Memento> stack = new Stack<Memento>(); }
- 將多個備忘錄物件,序列化和持久化,存放到本地計算機硬碟中
package memento;
/**
* 負責人類
* 管理備忘錄物件
* @author sxhDrk
*
*/
public class CareTaker {
private EmpMemento memento;
public EmpMemento getMemento() {
return memento;
}
public void setMemento(EmpMemento memento) {
this.memento = memento;
}
}
測試
package memento;
public class Client {
public static void main(String[] args) {
CareTaker taker = new CareTaker();
Emp emp = new Emp("我", 18, 900);
System.out.println("第一次列印物件:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary());
taker.setMemento(emp.memento());//一次備份
emp.setAge(38);
emp.setEname("你");
emp.setSalary(10000);
System.out.println("第二次列印物件:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary());
emp.recovery(taker.getMemento());//恢復到備忘錄物件儲存的狀態
System.out.println("第三次列印物件:"+emp.getEname()+"---"+emp.getAge()+"---"+emp.getSalary());
}
}
//結果——————————————————————————————————————————————
第一次列印物件:我---18---900.0
第二次列印物件:你---38---10000.0
第三次列印物件:我---18---900.0