設計模式(十八) 備忘錄模式
阿新 • • 發佈:2018-11-09
備忘錄模式: 在不破壞封裝性的前提下,捕獲一個物件的內部狀態, 並在該物件之外儲存這個狀態。這樣以後可將該物件恢復到原先儲存的狀態
備忘錄模式角色:
- 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的訪問許可權。 可以增加一個介面,完成關聯的效果。
要點:
考慮到物件的安全問題。一個類可以實現多個介面, 一個是業務的正常介面,叫寬介面。 另一個介面是空介面,目的是提供給子系統外的模組訪問。比如容器物件,這個叫做窄介面。