簡介
備忘錄設計模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于實作防丟失、撤銷、恢復等功能,
其定義是,在不違背封裝原則的前提下,捕獲一個物件的內部狀態,并在該物件之外保存這個狀態,以便之后恢復物件先前的狀態,
典型實作
首先,定義一個備忘錄 Memento 類存盤狀態,其代碼示例如下:
public class Memento {
private String state;
public Memento(Originator o) {
this.state = o.getState();
}
public void setState(String State) {
this.state = state;
}
public String getState() {
return this.state;
}
}
然后,把需要被存盤狀態的物件稱作為發起者,定義為 Originator 類,包含用于存盤成員資料的屬性,其代碼示例如下:
public class Originator {
private String state;
public Originator() {}
// 創建一個備忘錄物件
public Memento createMemento() {
return new Memento(this);
}
// 根據備忘錄狀態恢復原發器狀態
public void restoreMemento(Memento m) {
state = m.getState();
}
public void setState(String State) {
this.state = state;
}
public String getState() {
return this.state;
}
}
定義一個負責人 Caretaker 用于管理備忘錄物件,其代碼示例如下:
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return this.memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
總結
優點
備忘錄模式的主要優點如下:
- 給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態
- 實作了內部狀態的封裝,使得用戶不需要關心狀態的保存細節
缺點
備忘錄模式的主要缺點如下:
- 如果要保存的內部狀態資訊過多或者特別頻繁,將會占用比較大的記憶體資源
適用場景
備忘錄模式的適用場景如下:
- 保存一個物件在某一時刻的全部狀態或部分狀態,方便后續實作恢復和撤銷
- 防止外界物件破壞一個物件歷史狀態的封裝性,避免將物件歷史狀態的實作細節暴露給外界物件
原始碼
在 JDK 中 java.util.Date 通過自身內部的一個 Long 值來實作備忘錄模式,
如下是原始碼部分:
public class Date implements java.io.Serializable, Cloneable, Comparable<Date> {
private transient long fastTime;
public Date(long date) {
fastTime = date;
}
public long getTime() {
return getTimeImpl();
}
private final long getTimeImpl() {
if (cdate != null && !cdate.isNormalized()) {
normalize();
}
return fastTime;
}
}
首發于翔仔的個人博客,點擊查看更多,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527894.html
標籤:設計模式
上一篇:第1章 軟體架構與需求分析方法
下一篇:第1章 軟體架構與需求分析方法
