日韩性视频-久久久蜜桃-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)——备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕一区在线播放 | 蜜桃精品一区二区 | 亚洲视频网站在线 | 视频免费观看在线 | 性按摩玩人妻hd中文字幕 | 久久久久久穴 | 亚洲国产婷婷香蕉久久久久久99 | 国产精品久久久久久亚洲调教 | 精久久 | av色站 | 亚洲第一毛片 | 三上悠亚在线观看一区二区 | 色偷偷影院 | 男人的天堂成人 | 色妞综合 | 91极品美女| 亚洲狼人色| 在线射 | 都市激情校园春色 | 97国产在线观看 | 欧洲一级片 | 国产日韩欧美一区 | 天堂网视频在线 | 精品日韩av| 91精品国产综合久久香蕉922 | 久久久午夜精品福利内容 | 91口爆一区二区三区在线 | 538在线精品 | 撸撸在线视频 | 日韩最新av | yjizz国产 | 无码人妻一区二区三区线 | 成年人视频免费在线观看 | 国产福利小视频在线观看 | 精品国产自在精品国产精小说 | 色多多黄色 | 1024精品一区二区三区日韩 | 蜜桃av在线免费观看 | 国产女上位 | 欧美一本 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 中文字幕乱码亚洲精品一区 | 少妇被爽到高潮动态图 | 精品一区二区中文字幕 | 十八禁视频网站在线观看 | 红桃视频成人在线 | 日日夜夜狠狠爱 | 亚洲精品9999 | 午夜久久久久久久久久影院 | 处破女av一区二区 | 天堂a√在线 | 中国老头同性xxxxx | 欧美一级大片免费看 | 18禁网站免费无遮挡无码中文 | 777777av| www.色视频 | 爱久久 | 最新永久地址 | 丁香九月婷婷 | 琪琪女色窝窝777777 | 女人17片毛片60分钟 | 一区二区三区在线播放 | 少妇高潮惨叫久久久久久 | 亚洲成人免费在线观看 | 欧美日韩在线免费视频 | 久久综合激的五月天 | 成年女人18级毛片毛片免费 | av国产免费| 亚洲国产精品久久久久久 | 国产人妻一区二区三区四区五区六 | 国产综合亚洲精品一区二 | 日日夜夜狠狠操 | 少妇被躁爽到高潮无码文 | 久草资源在线观看 | 午夜寻花 | 午夜影院男女 | 国产最新自拍 | 色射色| 精品久久久久久久久久岛国gif | 日韩黄色免费网站 | 吸咬奶头狂揉60分钟视频 | 日韩播放 | 天堂网在线观看 | 女攻总攻大胸奶汁(高h) | 乱码av | 成人理论影院 | www.一区二区三区四区 | 国产亚洲精品成人无码精品网站 | 羞羞免费视频 | 久久黄色片 | 久久久蜜桃一区二区人 | 日本黄色a视频 | 日本一区二区在线 | 欧美精品一二三区 | 秋霞福利 | 国产欧美综合一区二区三区 | 美女扒开尿口让男人捅爽 | 91久久网 | 男生坤坤放进女生坤坤里 |