Memento(备忘录)--对象行为型模式
Memento(備忘錄)–對象行為型模式
一、意圖
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保持這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
二、動機
1.在軟件構建過程中,某些對象的狀態子啊轉換過程中,可能由于某種需要,要求程序能夠回溯到對象之前處于某個點時的狀態。如果使用一些共有接口來讓其他對象得到對象的狀態,便會暴露對象的細節實現。
2.如何實現對象狀態的良好保存與恢復?但同時又不會因此而破壞對象本身的封裝性。
三、適用性
1.必須保存一個對象在某個時刻的(部分)狀態,這樣以后需要時它才能恢復到先前的狀態。
2.如果一個用接口來讓你過其他對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。
四、結構
五、效果
1.保持封裝邊界 使用備忘錄可以避免暴露一些只應由原發器之外的信息。該模式把可能很復雜的Originator內部信息對其他對象屏蔽起來,從而保持了封裝邊界。
2.它簡化了原發器 在其他的保持封裝性的設計中,Originator負責保持客戶請求過的內部狀態版本。這就把所有存儲管理的重任交給了Originator。讓客戶管理它們請求的狀態將會簡化Originator,并且使得客戶工作結束時無通知原發器。
3.使用備忘錄可能代價很高 如果原發器在生成備忘錄時必須拷貝存儲大量的信息,或者客戶非常頻繁地創建備忘錄和恢復原發器狀態,可能導致非常大的開銷。除非封裝和恢復Originator狀態的開銷不大,否則該模式可能并不合適。
4.定義窄接口和寬接口 在一些語言中可能難以保證只有原發器可訪問備忘錄的狀態。
5.維護備忘錄的潛在代價 管理器負責刪除它所維護的備忘錄。然而,管理器不知道備忘錄中有多少個狀態。因此當存儲備忘錄時,一個本來很小的管理器,可能會產生大量的存儲開銷
六、實現
1.語言支持 備忘錄有兩個接口:一個為原發器所使用的寬接口,一個為其他對象所使用的窄接口。理想的實現語言應支持兩級的靜態保護。在C++中,可將Originator作為Mementor的一個友元,并使用Memento寬接口為私有。只有窄接口應該被聲明為公共的。
2.存儲增量式改變 如果備忘錄的創建及其返回(給他們的原發器)的順序是可預測的,備忘錄可以僅存儲原發器內部狀態的增量改變。
七、要點總結
1.備忘錄(Memento)存儲原發器(Originator)對象的內部狀態,在需要時恢復原發器狀態。
2.Memento模式的核心是信息隱藏,即Originator需要向外界隱藏信息,保持其封裝性。但同時又需要將狀態保持到外界(Memento)
3.由于現代語言運行時(如C#、Java等)都具有相當的對象序列化支持,因此往往采用效率較高、又較容易正確實現的序列化方案來實現Memento模式。
八、相關模式
Command:命令可使用備忘錄來為可撤銷的操作維護狀態。
Iterator:備忘錄可用于迭代。
九、舉例說明
相當于時光倒流器
本文為李建忠設計模式視頻的筆記以及《設計模式-可復用面向對象的軟件的基礎》和自己的部分見解
總結
以上是生活随笔為你收集整理的Memento(备忘录)--对象行为型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样推广新开的淘宝店淘宝新开店铺怎么推广
- 下一篇: 微信公众号口令红包怎么发? 微信公众号发