定義:java
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣就能夠將該對象恢復到原先保存的狀態git
類型:行爲型模式 github
順口溜:中訪策備迭 觀模命狀職解this
發起人:記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責建立和恢復備忘錄數據。spa
備忘錄:負責存儲發起人對象的內部狀態,在須要的時候提供發起人須要的內部狀態。code
管理角色:對備忘錄進行管理,保存和提供備忘錄。orm
package com.amosli.dp.behavior.memento; /** * 備忘錄 * @author amosli * */ public class Memento { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public Memento(String state) { this.state = state; } } package com.amosli.dp.behavior.memento; /** * 發起人 * @author amosli * */ public class Originator { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public void setMemento(Memento memento) { state = memento.getState(); } public Memento createMemento() { return new Memento(state); } public void show(){ System.out.println(state); } } package com.amosli.dp.behavior.memento; /** * 管理者 * @author amosli * */ public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } } package com.amosli.dp.behavior.memento; public class Client { public static void main(String[] args) { Originator originator = new Originator(); originator.setState("start"); originator.show(); Memento memento = originator.createMemento(); Caretaker caretaker = new Caretaker(); caretaker.setMemento(memento); originator.setState("over"); originator.show(); originator.setMemento(caretaker.getMemento()); originator.show(); } }
一、 須要保存一個對象在某一個時刻的狀態或部分狀態。對象
二、 若是用一個接口來讓其餘對象獲得這些狀態,將會暴露對象的實現細節並破壞對象的封裝性,一個對象不但願外界直接訪問其內部狀態,經過負責人能夠間接訪問其內部狀態。接口
一、有時一些發起人對象的內部信息必須保存在發起人對象之外的地方,可是必需要由發起人對象本身讀取,這時,ci
使用備忘錄模式能夠把複雜的發起人內部信息對其餘的對象屏蔽起來,從而能夠恰當地保持封裝的邊界。
二、本模式簡化了發起人類。發起人再也不須要管理和保存其內部狀態的一個個版本,客戶端能夠自行管理他們所需
要的這些狀態的版本。
三、當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可使用暫時存儲起來的備忘錄將狀態復原。
一、若是發起人角色的狀態須要完整地存儲到備忘錄對象中,那麼在資源消耗上面備忘錄對象會很昂貴。
二、當負責人角色將一個備忘錄 存儲起來的時候,負責人可能並不知道這個狀態會佔用多大的存儲空間,從而沒法提醒用戶一個操做是否很昂貴。
三、當發起人角色的狀態改變的時候,有可能這個協議無效。若是狀態改變的成功率不高的話,不如採起「假如」協議模式。
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!