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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

温故知新(8)——备忘录模式

發布時間:2024/9/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 温故知新(8)——备忘录模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

先從面向對象的三大特征之一封裝說起。面向對象的封裝簡單點說就是把狀態(數據)和行為(操作這些數據的方法)放到一起,構成一個單元,通常叫做類。一個對象的行為是事先確定好的(靜態)一些腳本,如果對象的狀態相同,對象看起來就是一樣的。所以當我們需要把一個對象的某一時刻保存起來,那么只需要保存它在那個時刻的狀態;相反需要恢復對象到某一時刻時,只需恢復它在那個時刻的狀態。這就是備忘錄模式的原理。

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。

上面是GOF對備忘錄模式的意圖描述,非常清楚,內部狀態保存到外部,再從外部恢復對象。

實現時我們通常把需要保存起來的狀態封裝為一個對象,用這個對象作為一個信息的載體,保存或恢復。出于避免外界對這些信息進行竄改,有必要對這個信息載體進行一個抽象,讓外界只知道這是一個信息載體,而不知道具體承載了什么內容(窄接口);而內部可以獲得載體所載有的全部信息(寬接口)。

備忘錄模式常用來實現“撤銷/重做”。

結構

備忘錄模式的類圖:

模式的參與者只有三個,相對簡單。

1、作為對象狀態信息載體的備忘錄對象——IMemento、Memento,其中IMemento為對外的窄接口,而具體實現Memento則是對內的寬接口;

2、需要保存和恢復狀態的對象,成為原發器——Originator;

3、管理和持有備忘錄的備忘錄負責人——Caretaker;

示例

有一個電子書閱讀器,人們可以用它來閱讀電子文檔。閱讀器提供了書簽的功能,用戶可以保存書簽,也可以從使用一個書簽使閱讀器變為建立書簽時的狀態。我們簡化一下,假設閱讀器可以從書名和書的頁碼兩個參數確定自身狀態。

上面的需求很符合備忘錄模式,書簽可以看作備忘錄對象,閱讀器可以看作原發器,而隱含的書簽管理結構可以作為負責人。

1、定義備忘錄接口IBookmark(對外窄接口)。

1: using System; 2: ? 3: namespace DesignPatterns.Memento 4: { 5: /// <summary> 6: /// 書簽接口(對外的窄接口) 7: /// </summary> 8: public interface IBookmark 9: { } 10: } 11: ?

2、閱讀器類Reader,同時以私有內部類的形式實現具體的備忘錄Bookmark(對內寬接口)。

1: using System; 2: ? 3: namespace DesignPatterns.Memento 4: { 5: /// <summary> 6: /// 閱讀器 7: /// </summary> 8: public class Reader 9: { 10: public Reader(string bookName, int pageNumber) 11: { 12: this.bookName = bookName; 13: this.pageNumber = pageNumber; 14: } 15: ? 16: //書名 17: private string bookName; 18: ? 19: //頁碼 20: private int pageNumber; 21: ? 22: //獲得一個書簽 23: public IBookmark GetBookmark() 24: { 25: Console.WriteLine("建立書簽:《" + this.bookName + "》第" + pageNumber + "頁"); 26: return new Bookmark(this.bookName, this.pageNumber); 27: } 28: ? 29: //從書簽恢復 30: public void Restore(IBookmark bookMark) 31: { 32: Bookmark bk = (Bookmark)bookMark; 33: this.bookName = bk.BookName; 34: this.pageNumber = bk.PageNumber; 35: Console.WriteLine("恢復書簽:《" + this.bookName + "》第" + pageNumber + "頁"); 36: } 37: ? 38: //閱讀 39: public void Read() 40: { 41: Console.WriteLine("閱讀:《" + this.bookName + "》第" + pageNumber + "頁"); //閱讀 42: pageNumber++; //翻頁 43: } 44: ? 45: /// <summary> 46: /// 書簽實現(用內部類的方式實現對外的保密,或者說對內的寬接口) 47: /// </summary> 48: private class Bookmark : IBookmark 49: { 50: public Bookmark(string bookName, int pageNumber) 51: { 52: this.BookName = bookName; 53: this.PageNumber = pageNumber; 54: } 55: ? 56: /// <summary> 57: /// 書名 58: /// </summary> 59: public string BookName { get; set; } 60: ? 61: /// <summary> 62: /// 頁碼 63: /// </summary> 64: public int PageNumber { get; set; } 65: } 66: } 67: } 68: ?

3、書簽管理器BookmarkCaretaker。

1: using System; 2: using System.Collections.Generic; 3: ? 4: namespace DesignPatterns.Memento 5: { 6: /// <summary> 7: /// 書簽管理器 8: /// </summary> 9: public class BookmarkCaretaker 10: { 11: public BookmarkCaretaker() 12: { 13: this.bookmarks = new Dictionary<int, IBookmark>(); 14: } 15: ? 16: private Dictionary<int, IBookmark> bookmarks; 17: ? 18: public void AddBookmark(int key, IBookmark bookmark) 19: { 20: this.bookmarks.Add(key, bookmark); 21: } 22: ? 23: public void RemoveBookmark(int key) 24: { 25: this.bookmarks.Remove(key); 26: } 27: ? 28: public IBookmark GetBookmark(int key) 29: { 30: return bookmarks[key]; 31: } 32: } 33: } 34: ?

4、測試客戶端代碼。

1: using System; 2: ? 3: namespace DesignPatterns.Memento 4: { 5: class Program 6: { 7: static void Main(string[] args) 8: { 9: BookmarkCaretaker caretaker = new BookmarkCaretaker(); 10: Reader reader = new Reader("設計模式", 1); 11: reader.Read(); 12: reader.Read(); 13: reader.Read(); 14: ? 15: caretaker.AddBookmark(1, reader.GetBookmark()); 16: reader.Read(); 17: reader.Read(); 18: ? 19: caretaker.AddBookmark(2, reader.GetBookmark()); 20: reader.Read(); 21: ? 22: reader.Restore(caretaker.GetBookmark(1)); 23: reader.Read(); 24: ? 25: Console.WriteLine("按任意鍵結束..."); 26: Console.ReadKey(); 27: } 28: } 29: } 30: ?

5、運行,查看結果。

轉載于:https://www.cnblogs.com/zdy_bit/archive/2012/09/14/2684568.html

總結

以上是生活随笔為你收集整理的温故知新(8)——备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 自拍偷在线精品自拍偷无码专区 | www.狠狠| 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美视频在线观看 | 在线观看免费福利 | 美国毛片基地 | 91超碰在线 | 亚洲精视频 | 亚洲第一视频在线播放 | 三级网站| 在线免费看av片 | 亚洲精品网站在线观看 | 久久这里只有精品国产 | 成人伊人 | 国产不雅视频 | 奇米影视大全 | 在线免费观看一区二区 | 精品久久久精品 | 色偷偷综合网 | 黄色一级片| 精品久久久久久久 | 色婷婷在线视频 | 成人国产精品免费观看 | 国产一区二区视频网站 | 欧美黑人狂野猛交老妇 | 风流僵尸艳片a级 | 波多野结衣喷潮 | 国产精品秘入口18禁麻豆免会员 | 色婷亚洲| 在线免费日韩 | 午夜免费小视频 | 天堂国产一区二区三区 | 国产碰碰 | 97超碰人 | 啪啪网站免费 | 精品人伦一区二区三电影 | 视频成人免费 | 欧美成人天堂 | 欧美偷拍亚洲 | 秋霞网一区二区 | 潮喷失禁大喷水无码 | 天天想你免费观看完整版高清电影 | 男生女生羞羞网站 | 91精品视频网 | 富二代成人短视频 | 91精品国产综合久久国产大片 | 久久一区二区三区精品 | 久久久久久久久97 | 亚洲一区二区三区婷婷 | 成人第一页 | 69精品在线 | 亚洲av无码一区二区三区人妖 | 亚洲AV午夜福利精品一级无码 | 亚洲国产成人va在线观看天堂 | 在线观看国产三级 | 毛片网站在线播放 | 亚洲网站在线播放 | 日韩在线精品 | 欧洲美熟女乱又伦 | 欧美影音 | 国产精品国产馆在线真实露脸 | 国产十八熟妇av成人一区 | 欧美人妻精品一区二区免费看 | 驯服少爷漫画免费观看下拉式漫画 | 3d动漫精品啪啪一区二区竹菊 | a级片在线免费观看 | 亚洲AV第二区国产精品 | 影音先锋色小姐 | 日韩精品播放 | 精品国产一区二区三区在线 | 精品999久久久一级毛片 | 国产精品一| 欧美日韩色图 | 四虎影视免费观看 | 九九热伊人| 原创少妇半推半就88av | 国产精品精品国产色婷婷 | 久久久久国产一区 | 国产夫妻久久 | 九九久久国产视频 | videos另类灌满极品另类 | caoprom97| 成年人晚上看的视频 | 欧美久久视频 | 激情网婷婷 | 老司机精品在线 | 古代黄色片 | 成人国产免费视频 | 爱啪啪导航 | 男女羞羞的视频 | 成人精品久久 | 一区二区播放 | 奇米激情 | 日韩最新在线 | 淫五月 | 美女国产毛片a区内射 | 日韩在线观看视频一区二区 | 国产色在线观看 | 15p亚洲 |