日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式19——行为型模式之备忘录模式

發(fā)布時間:2024/4/15 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式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();??
  • ????????????//?退回到初始狀態(tài)??
  • ????????????war3.SetMemento(caretaker.Memento);??
  • ????????????war3.Start();??
  • ????????}??
  • ????}??
  • }??


  • 適用性:

  • 必須保存一個對象在某一個時刻(部分)的狀態(tài),?這樣以后需要它時才能恢復(fù)到先前的狀態(tài)。
  • 如果一個用接口來讓其它對象直接得到這些狀態(tài),將會暴露對象的實現(xiàn)細(xì)節(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)容還不錯,歡迎將生活随笔推薦給好友。