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