Java學習筆記(六) 分支語句
阿新 • • 發佈:2020-11-17
定義:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,以便以後當需要時,能將該物件恢復到原先儲存的狀態。
優點:
1,提供了一種可以恢復狀態的機制,當用戶需要時能夠比較方地將資料恢復到某個歷史的狀態
2,實現了內部狀態的封裝,除了建立它的發起人之外,其他物件都不能夠訪問這寫狀態資訊
3,簡化了發起人類,發起人不需要管理和儲存其內部狀態的各個部分,所有狀態資訊都儲存在備忘錄中,並由管理者進行管理,這符合單一職責原則
缺點:
資源消耗大,如果要儲存的內部狀態資訊過多或者特別頻繁,將會佔用比較大的記憶體資源
模式的結構
1,發起人角色:記錄當前時刻的內部狀態資訊,提供建立備忘錄和恢復備忘錄資料的功能,實現其他業務功能,它可以訪問備忘錄裡的所有資訊
2,備忘錄角色:負責儲存發起人的內部狀態,在需要的時候提供這些內部狀態給發起人
3,管理者角色:對備忘錄進行管理,提供儲存與獲取備忘錄的功能,但不能對備忘錄的內容進行訪問與修改
使用場景
1,需要儲存與恢復資料的場景,如玩遊戲時的中間結果的存檔功能
2,需要提供一個回滾操作功能的場景,如:word,記事本,photoshop,eclise等軟體在編輯時按ctrl+z組合鍵,還有資料庫事務操作
程式碼:
package 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; } }