生活随笔
收集整理的這篇文章主要介紹了
设计模式19——行为型模式之备忘录模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| ?定義:備忘錄模式(MementoPattern),在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。 類型:對象行為型模式。 概述: ??????????備忘錄模式使用的范圍比較窄,即比較復雜的狀態需要恢復到之前的狀態。現實更多的情況只有很簡單的狀態需要恢復,如果用備忘錄模式有點大材小用的感覺。就像用大炮打蚊子,起不到什么作用。在《Head First Design Patterns》,備忘錄模式也被列為不常用的模式之一。 ?????????備忘錄模式相對比較簡單,即把一個有著復雜狀態且需要恢復Originator的對象中的一些需要被保存的狀態再次抽象出來,并提供一些操作接口封裝成一個Memento類。這樣將極大簡化Originator類的復雜性。Memento的接口因為是操作狀態的,所以不應該開放給更多的人知道,所以這里又繼續封裝了一個管理Memento類的Caretaker類,并提供一些簡單對外的接口。 ????????恢復狀態,其實玩過單機劇情類游戲的人都會馬上想到“存檔”這個功能。“存檔”功能在某種意義上就是備忘錄的一種應用。這里即以我最喜歡的游戲Warcraft?III為示例。 類圖: 參與者: Warcraft,也即Originator,它的狀態需要被記錄以及恢復。Memento,抽象出Warcraft的內部狀態,并提供操作方法。Caretaker,管理Memento,并向外提供記錄及恢復狀態的方法,但是不了解具體的執行過程。示例代碼: ? [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();??????????}??????}??}??
|
適用性:
必須保存一個對象在某一個時刻(部分)的狀態,?這樣以后需要它時才能恢復到先前的狀態。如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。優缺點:
優點,降低對象之間的耦合度,還降低管理對象的復雜度。缺點,如果需要存儲的信息非常多,將會贊成非常大的開銷。參考資料:
《設計模式——可復用面向對象軟件基礎》《大話設計模式》
轉載于:https://www.cnblogs.com/feihe0755/p/3588519.html
總結
以上是生活随笔為你收集整理的设计模式19——行为型模式之备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。