備忘錄模式-行為型
阿新 • • 發佈:2021-08-04
模式的定義與特點
備忘錄(Memento)模式的定義:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,以便以後當需要時能將該物件恢復到原先儲存的狀態。該模式又叫快照模式。
備忘錄模式是一種物件行為型模式,其主要優點如下。
- 提供了一種可以恢復狀態的機制。當用戶需要時能夠比較方便地將資料恢復到某個歷史的狀態。
- 實現了內部狀態的封裝。除了建立它的發起人之外,其他物件都不能夠訪問這些狀態資訊。
- 簡化了發起人類。發起人不需要管理和儲存其內部狀態的各個備份,所有狀態資訊都儲存在備忘錄中,並由管理者進行管理,這符合單一職責原則。
其主要缺點是:資源消耗大。如果要儲存的內部狀態資訊過多或者特別頻繁,將會佔用比較大的記憶體資源。
模式的結構與實現
備忘錄模式的核心是設計備忘錄類以及用於管理備忘錄的管理者類,現在我們來學習其結構與實現。
1. 模式的結構
備忘錄模式的主要角色如下。
- 發起人(Originator)角色:記錄當前時刻的內部狀態資訊,提供建立備忘錄和恢復備忘錄資料的功能,實現其他業務功能,它可以訪問備忘錄裡的所有資訊。
- 備忘錄(Memento)角色:負責儲存發起人的內部狀態,在需要的時候提供這些內部狀態給發起人。
- 管理者(Caretaker)角色:對備忘錄進行管理,提供儲存與獲取備忘錄的功能,但其不能對備忘錄的內容進行訪問與修改。
備忘錄模式的結構圖如圖 1 所示。
package net.biancheng.c.memento; public class MementoPattern { public static void main(String[] args) { Originator or = new Originator(); Caretaker cr = new Caretaker(); or.setState("S0"); System.out.println("初始狀態:" + or.getState()); cr.setMemento(or.createMemento()); //儲存狀態 or.setState("S1"); System.out.println("新的狀態:" + or.getState()); or.restoreMemento(cr.getMemento()); //恢復狀態 System.out.println("恢復狀態:" + or.getState()); } } //備忘錄 class Memento { private String state; public Memento(String state) { this.state = state; } public void setState(String state) { this.state = state; } public String getState() { return state; } } //發起人 class Originator { private String state; public void setState(String state) { this.state = state; } public String getState() { return state; } public Memento createMemento() { return new Memento(state); } public void restoreMemento(Memento m) { this.setState(m.getState()); } } //管理者 class Caretaker { private Memento memento; public void setMemento(Memento m) { memento = m; } public Memento getMemento() { return memento; } }