生活随笔
收集整理的這篇文章主要介紹了
设计模式19——行为型模式之备忘录模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? 定義: 備忘錄模式(MementoPattern),在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。 類型:對象行為型模式。
概述:
??????????備忘錄模式使用的范圍比較窄,即比較復(fù)雜的狀態(tài)需要恢復(fù)到之前的狀態(tài)。現(xiàn)實更多的情況只有很簡單的狀態(tài)需要恢復(fù),如果用備忘錄模式有點大材小用的感覺。就像用大炮打蚊子,起不到什么作用。在《Head First Design Patterns》,備忘錄模式也被列為不常用的模式之一。
?????????備忘錄模式相對比較簡單,即把一個有著復(fù)雜狀態(tài)且需要恢復(fù)Originator的對象中的一些需要被保存的狀態(tài)再次抽象出來,并提供一些操作接口封裝成一個Memento類。這樣將極大簡化Originator類的復(fù)雜性。Memento的接口因為是操作狀態(tài)的,所以不應(yīng)該開放給更多的人知道,所以這里又繼續(xù)封裝了一個管理Memento類的Caretaker類,并提供一些簡單對外的接口。
????????恢復(fù)狀態(tài),其實玩過單機劇情類游戲的人都會馬上想到“存檔”這個功能。“存檔”功能在某種意義上就是備忘錄的一種應(yīng)用。這里即以我最喜歡的游戲Warcraft?III為示例。
類圖:
參與者:
Warcraft,也即Originator,它的狀態(tài)需要被記錄以及恢復(fù)。 Memento,抽象出Warcraft的內(nèi)部狀態(tài),并提供操作方法。 Caretaker,管理Memento,并向外提供記錄及恢復(fù)狀態(tài)的方法,但是不了解具體的執(zhí)行過程。 示例代碼:
?
[csharp] ?view plaincopy using ?System;??using ?System.Collections.Generic;??using ?System.Text;??namespace ?Pattern19??{?? ????class ?Warcrift?? ????{?? ????????private ?string ?role;?? ????????public ?string ?Role?? ????????{?? ????????????get ?{?return ?role;?}?? ????????????set ?{?role?=?value;?}?? ????????}?? ????????public ?Memento?CreateMemento()?? ????????{?? ????????????return ?(new ?Memento(role));?? ????????}?? ????????public ?void ?SetMemento(Memento?memento)?? ????????{?? ????????????role?=?memento.Role;?? ????????}?? ????????public ?void ?Start()?? ????????{?? ????????????Console.WriteLine("There?is?a?" ?+?role);?? ????????}?? ????}?? ????class ?Memento?? ????{?? ????????private ?string ?role;?? ????????public ?Memento(string ?_role)?? ????????{?? ????????????this .role?=?_role;?? ????????}?? ????????public ?string ?Role?? ????????{?? ????????????get ?{?return ?role;?}?? ????????}?? ????}?? ????class ?Caretaker?? ????{?? ????????private ?Memento?memento;?? ????????public ?Memento?Memento?? ????????{?? ????????????get ?{?return ?memento;?}?? ????????????set ?{?memento?=?value;?}?? ????????}?? ????}?? ????class ?Program?? ????{?? ????????static ?void ?Main(string []?args)?? ????????{?? ?????????????? ????????????Warcrift?war3?=?new ?Warcrift();?? ????????????war3.Role?=?"Hero" ;?? ????????????war3.Start();?? ????????????Caretaker?caretaker?=?new ?Caretaker();?? ????????????caretaker.Memento?=?war3.CreateMemento();?? ?????????????? ????????????war3.Role?=?"Soldier" ;?? ????????????war3.Start();?? ?????????????? ????????????war3.SetMemento(caretaker.Memento);?? ????????????war3.Start();?? ????????}?? ????}?? }??
適用性:
必須保存一個對象在某一個時刻(部分)的狀態(tài),?這樣以后需要它時才能恢復(fù)到先前的狀態(tài)。 如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性。 優(yōu)缺點:
優(yōu)點,降低對象之間的耦合度,還降低管理對象的復(fù)雜度。 缺點,如果需要存儲的信息非常多,將會贊成非常大的開銷。 參考資料:
《設(shè)計模式——可復(fù)用面向?qū)ο筌浖A(chǔ)》 《大話設(shè)計模式》
轉(zhuǎn)載于:https://www.cnblogs.com/feihe0755/p/3588519.html
總結(jié)
以上是生活随笔 為你收集整理的设计模式19——行为型模式之备忘录模式 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。