設計模式--備忘錄模式Memento(行為型)
1 定義:
1.1 定義:Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later. (在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。)
1.2 通用類圖:
個人認為更易理解的類圖
Originator發起人角色
記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責建立和恢復備忘錄資料。
Memento備忘錄角色
負責儲存Originator發起人物件的內部狀態,在需要的時候提供發起人需要的內部狀態。
Caretaker備忘錄管理員角色
對備忘錄進行管理、儲存和提供備忘錄。
1.3 通用程式碼:
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());
}
}
2 優點
暫無
3 缺點
暫無
4 應用場景
4.1 需要保有存和恢復資料的相關狀態場景;
4.2 提供一個可回滾的操作;
4.3 需要監控的副本場景中;(如要監控一個物件的屬性,但監控又不應該作為系統的主業務來呼叫,它只是邊緣應用,即使出現監控不準、錯誤報警也影響不大。)
4.4 資料庫中的事務處理就使用備忘錄模式。
5 注意事項
5.1 備忘錄的生命週期:建立就要使用,要主動管理它的生命。
5.2 備忘錄的效能:不要在頻繁建立備份的場景中使用備忘錄模式(比如一個for迴圈中),原因是:一是控制不了其數量,二是大物件的建立是要消耗資源的,系統的效能需要考慮。
6 擴充套件
6.1 clone方式的備忘錄:通過複製的方式產生一個物件的內部狀態,類圖如下:
從類圖上來看,發起人角色融合了發起人角色和備忘錄角色,程式碼如下:
測試:
當前狀態:version 1.0.0
修改後狀態:version 2.0.0
恢復後狀態:version 1.0.0
仍可以進一步精簡,去掉管理備忘錄角色
6.2 多狀態的備忘錄模式:實際開發中,一個物件可能有多個狀態,一個JavaBean有多個屬性非常常見,如果隨上所述,就要寫一堆的狀態備份、還原語句?這裡介紹一個工具類BeanUtils,可以把類的所有屬性值轉換到HashMap中,亦可以把HashMap中的值放入物件中。
此方案的類圖如下:
原始碼如下:
通過這種方式,無論有多少狀態都可以。
6.3 多備份的備忘錄:可在通用原始碼上新增如下即可:
6.4 更好的封裝:雙介面(一個類可以實現多個介面,在系統設計時,如果考慮物件的安全問題,可以提供兩個介面,一個是業務的正常介面,實現必要的業務邏輯,叫做寬介面;另外一個介面是一個空介面,什麼方法都沒有,其目的是提供給子系統外的模組訪問,因此較安全。)
類圖如下:
原始碼如下:
內建類Memento全部是private訪問許可權,也就是說除了發起人外,別人休想訪問到,如果要產生關聯關係,就通過空介面進行。
轉自:http://blog.csdn.net/yuanlong_zheng/article/details/7584848
相關文章
- 設計模式 - 備忘錄模式 ( Memento )設計模式
- java設計模式-備忘錄模式(Memento)Java設計模式
- 行為型設計模式 - 備忘錄模式詳解設計模式
- C#設計模式系列:備忘錄模式(Memento)C#設計模式
- JAVA設計模式之 備忘錄模式【Memento Pattern】Java設計模式
- 備忘錄模式(Memento)模式
- Java備忘錄模式(Memento模式)Java模式
- Rust語言之GoF設計模式:備忘錄Memento模式RustGo設計模式
- 設計模式的征途—20.備忘錄(Memento)模式設計模式
- Net設計模式例項之備忘錄模式(Memento Pattern)(2)設計模式
- 設計模式----備忘錄模式設計模式
- 設計模式 - 備忘錄模式設計模式
- 行為型模式:備忘錄模式模式
- 無廢話設計模式(16)行為型模式--備忘錄模式設計模式
- 設計模式(十九):備忘錄模式設計模式
- 設計模式之備忘錄模式設計模式
- 設計模式:可複用物件導向軟體及基礎:4-7 物件行為模式:備忘錄模式(Memento)設計模式物件
- 簡說設計模式——備忘錄模式設計模式
- 極簡設計模式-備忘錄模式設計模式
- GoLang設計模式11 - 備忘錄模式Golang設計模式
- Python設計模式-備忘錄模式Python設計模式
- 大話設計模式—備忘錄模式設計模式
- 設計模式漫談之備忘錄模式設計模式
- 23種設計模式之備忘錄模式設計模式
- 折騰Java設計模式之備忘錄模式Java設計模式
- 設計模式 | 備忘錄模式及典型應用設計模式
- 19.java設計模式之備忘錄模式Java設計模式
- iOS設計模式之四:備忘錄模式和命令模式iOS設計模式
- 備忘錄設計模式知識概括設計模式
- 備忘錄模式模式
- 設計模式(Swift) - 2.單例模式、備忘錄模式和策略模式設計模式Swift單例
- Swift 中的設計模式 #2 觀察者模式與備忘錄模式Swift設計模式
- 抽絲剝繭——備忘錄設計模式設計模式
- 《設計模式七》備忘錄、模板方法、狀態模式及設計模式設計總結設計模式
- php設計模式備忘PHP設計模式
- 設計模式-行為型設計模式
- 行為型設計模式設計模式
- 我學設計模式 之 備忘模式設計模式