Behavioral模式之Memento模式
1.意圖
在不破壞封裝性的前提下,捕獲一個對象的內部狀態。并在該對象之外保存這個狀態,這樣以后就可將該對象恢復到原先保存的狀態。
2.別名
Token
3.動機
有時候有必要記錄一個對象的內部狀態。為了同意用戶取消不確定的操作或從錯誤中恢復過來,須要實現檢查點和取消機制,而要實現這些機制。你必須事先將狀態信息保存在某處,這樣才干是對象恢復到他們先前的狀態。
4.適用性
下面情況使用Memento模式:
- 必需保存一個對象在某一時刻的(部分)狀態,這樣以后須要時它能恢復到先前的狀態。
- 如果一個用接口來讓其他對象直接得到這些狀態。將會暴露對象的實現細節并破壞對象的封裝性。
5.結構
主要目的是保存一個對象的某個狀態,以便在適當的時候恢復對象,個人認為叫備份模式更形象些,通俗的講下:如果有原始類A。A中有各種屬性,A能夠決定須要備份的屬性,備忘錄類B是用來存儲A的一些內部狀態,類C呢。就是一個用來存儲備忘錄的。且僅僅能存儲,不能改動等操作。做個圖來分析一下:
6.代碼演示樣例
Original類是原始類。里面有須要保存的屬性value及創建一個備忘錄類。用來保存value值。Memento類是備忘錄類,Storage類是存儲備忘錄的類。持有Memento類的實例,該模式非常好理解。
直接看源代碼:
實現代碼:
數據結構:
實現:
public class Memento {private String value;public Memento(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;} }public class Storage {private Memento memento;public Storage(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;} } 測試類:public class Test {
public static void main(String[] args) {// 創建原始類Original origi = new Original("egg");// 創建備忘錄Storage storage = new Storage(origi.createMemento());// 改動原始類的狀態System.out.println("初始化狀態為:" + origi.getValue());origi.setValue("niu");System.out.println("改動后的狀態為:" + origi.getValue());// 回復原始類的狀態origi.restoreMemento(storage.getMemento());System.out.println("恢復后的狀態為:" + origi.getValue()); }}
“`
輸出:
初始化狀態為:egg
改動后的狀態為:niu
恢復后的狀態為:egg
簡單描寫敘述下:新建原始類時,value被初始化為egg,后經過改動,將value的值置為niu。最后倒數第二行進行恢復狀態,結果成功恢復了。事實上我認為這個模式叫“備份-恢復”模式最形象。
7.相關模式
- Command模式:命令模式能夠使用備忘錄來為可撤銷的操作維護狀態。
- Iterator模式:如前所述備忘錄可用于迭代。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539
總結
以上是生活随笔為你收集整理的Behavioral模式之Memento模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派3B用Ubuntu MATE安装r
- 下一篇: JS闭包问题(一)