1. 程式人生 > >設計模式(十八) 備忘錄模式

設計模式(十八) 備忘錄模式

備忘錄模式: 在不破壞封裝性的前提下,捕獲一個物件的內部狀態, 並在該物件之外儲存這個狀態。這樣以後可將該物件恢復到原先儲存的狀態

在這裡插入圖片描述

備忘錄模式角色:

  • Originator 發起人角色
  • Memento 備忘錄角色
  • Caretaker 備忘錄管理員角色
public class Originator{
	private String state="";
	public String getState(){
		return state;
	}
   public void setState(String state){
		this.state=state;
	}
	//建立備忘錄
	public Memento createMemento(){
		return new Memento(this.state);
	}
	//恢復備忘錄
	public void restoreMemento(Memento memento){
		this.setState(memento.getState());
	}
}

public class Memento{
	private String state="";
public Memento(String state){
	this.state=state;
}

public String getState(){
	return state;
}

public void setState(String state){
	this.state=state;
}
}

public class Caretaker{
	private Memento memento;
	public Memento getMemento(){
		return memento;
}

public void setMemento(Memento memento){
	this.memento=memento;
}
}

public  class Client{
	public static void main(String [] args){
		Originator originator=new Originator();
		Caretaker caretaker=new Caretaker();
		caretaker.setMemento(originator.createMemento());
		originator.restoreMemento(caretaker.getMemento());
}
}

備忘錄模式的應用場景

  • 需要提供一個可回滾的操作
  • 需要監控的副本場景中
  • 資料庫連線的事務管理就是用的備忘錄模式

備忘錄模式的注意事項

  • 備忘錄的生命週期 。要主動管理備忘錄物件,不使用就要刪除引用, 等待垃圾回收器對它的回收處理
  • 備忘錄的效能 不要在迴圈中使用備忘錄。1. 控制不了備忘錄建立的物件數量 2. 大物件的建立要消耗資源

備忘錄模式的擴充套件

  • 利用clone方式的備忘錄,這個也會牽涉到淺拷貝的問題
  • 利用hashmap進行多狀態,多版本的備忘錄
  • 為了達到更好的封裝。 可以採用內部類進行處理。 內部類全是private的訪問許可權。 可以增加一個介面,完成關聯的效果。

要點:

考慮到物件的安全問題。一個類可以實現多個介面, 一個是業務的正常介面,叫寬介面。 另一個介面是空介面,目的是提供給子系統外的模組訪問。比如容器物件,這個叫做窄介面。