1. 程式人生 > 其它 >Java中的23個設計模式 【行為型模式】 中的 【備忘錄模式】

Java中的23個設計模式 【行為型模式】 中的 【備忘錄模式】

技術標籤:設計模型設計模式pythonjava資料庫大資料

文章目錄

設計模式分類

  • 建立型模式
    • 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式
    • 關注物件的建立過程
  • 結構型模式
    • 介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式
    • 關注物件和類的組織
  • 行為型模式
    • 模板方法模式、命令模式、迭代器模式、觀察者模式、中介模式、備忘錄模式、直譯器模式、狀態模式、策略模式、責任鏈模式、訪問者模式
    • 關注系統同對象之間的相互互動,研究系統在執行時物件之間的相互通訊和協作,進一步明確物件的職責

備忘錄模式(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