C#備忘錄模式(Memento Pattern)實(shí)例教程
本文以一個(gè)簡(jiǎn)單實(shí)例講述了C#備忘錄模式(Memento Pattern)的實(shí)現(xiàn)方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
簡(jiǎn)單來(lái)說(shuō),備忘錄模式就是支持回退操作。假設(shè)讓一個(gè)Notepad支持回退操作,如何實(shí)現(xiàn)呢?
首先需要一個(gè)備忘錄類(lèi)。
public class Memento
{
private string _msg;
public Memento(string msg)
{
_msg = msg;
}
public string GetText()
{
return _msg;
}
}
上述代碼主要實(shí)現(xiàn):
1. 構(gòu)造函數(shù)在Nodepad每次記錄信息的時(shí)候調(diào)用,Nodepad所記錄的信息最終通過(guò)該構(gòu)造函數(shù)賦值給了_msg字段。
2. GetText方法在Nodepad執(zhí)行回退操作的時(shí)候調(diào)用
接下來(lái)就是Nodepad類(lèi)。
public class Notepad
{
private string _msg;
public Memento SetMsg(string msg)
{
Memento m = new Memento(msg);
_msg = msg;
return m;
}
public string GetMsg()
{
return _msg;
}
public void Undo(Memento previousState)
{
if (previousState != null)
{
_msg = previousState.GetText();
}
else
{
_msg = "";
}
}
}
上述代碼實(shí)現(xiàn):
1. 維護(hù)著一個(gè)類(lèi)型為string的字段_msg,代表顯示在Nodepad上的文字
2. 記錄信息方法SetMsg:不僅要把記錄的信息賦值給_msg,還要把信息傳遞給備忘錄類(lèi)
3. 獲取信息方法GetMsg:讀取_msg
4. 回退操作方法Undo:把備忘錄的上一次信息賦值給_msg。如果回退到第一次以前的操作,相當(dāng)于備忘錄為null,需要考慮為null的情況
客戶(hù)端需要有一個(gè)備忘錄的列表,維護(hù)者所有的備忘錄信息。
class Program
{
static void Main(string[] args)
{
IList<Memento> undos = new List<Memento>();
Notepad notepad = new Notepad();
Memento undo;
undo = notepad.SetMsg("Hello");
undos.Add(undo);
undo = notepad.SetMsg("World");
undos.Add(undo);
Console.WriteLine("進(jìn)入Nodepad查看信息");
Console.WriteLine(notepad.GetMsg());
Console.WriteLine("1、接著執(zhí)行一個(gè)回退操作");
notepad.Undo(undos[0]);
Console.WriteLine("回退操作以后查看信息");
Console.WriteLine(notepad.GetMsg());
Console.WriteLine("2、再執(zhí)行一個(gè)回退操作");
notepad.Undo(null);
Console.WriteLine("回退操作以后再查看信息");
Console.WriteLine(notepad.GetMsg());
Console.ReadKey();
}
}
運(yùn)行結(jié)果如下圖所示:

通過(guò)上述運(yùn)行結(jié)果可見(jiàn):
1. 第一次進(jìn)入Notepad查看信息看到的是最后一次輸入的World;
2. 回退一次,第二次進(jìn)入Notepad查看信息看到的是第一次輸入的Hello;
3. 再回退一次,第三次進(jìn)入Notepad查看信息看到的是空字符串。
相信本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有一定的借鑒價(jià)值。
相關(guān)文章
在C#程序中對(duì)MessageBox進(jìn)行定位的方法
這篇文章主要介紹了在C#程序中對(duì)MessageBox進(jìn)行定位的方法,針對(duì)圖形化界面進(jìn)行調(diào)試,需要的朋友可以參考下2015-07-07
C#修改IIS站點(diǎn)framework版本號(hào)的方法
這篇文章主要介紹了C#修改IIS站點(diǎn)framework版本號(hào)的方法,涉及C#調(diào)用使用ASP.NET IIS注冊(cè)工具Aspnet_regiis.exe進(jìn)行IIS站點(diǎn)framework版本號(hào)修改的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
C#簡(jiǎn)單多線(xiàn)程同步和優(yōu)先權(quán)用法實(shí)例
這篇文章主要介紹了C#簡(jiǎn)單多線(xiàn)程同步和優(yōu)先權(quán)用法實(shí)例,對(duì)于C#線(xiàn)程的阻塞、同步、異步、互斥等概念做了較為深入的分析與實(shí)例講解,需要的朋友可以參考下2014-09-09
C#使用NAudio實(shí)現(xiàn)監(jiān)聽(tīng)系統(tǒng)聲音
這篇文章主要為大家詳細(xì)介紹了C#如何使用NAudio實(shí)現(xiàn)監(jiān)聽(tīng)系統(tǒng)聲音并屏蔽麥克風(fēng)其他聲音,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2024-02-02
C#開(kāi)發(fā)WinForm清空DataGridView控件綁定的數(shù)據(jù)
本文詳細(xì)講解了C#開(kāi)發(fā)WinForm清空DataGridView控件綁定數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
c# 實(shí)現(xiàn)RSA非對(duì)稱(chēng)加密算法
RSA解決了對(duì)稱(chēng)加密的一個(gè)不足,比如AES算法加密和解密時(shí)使用的是同一個(gè)秘鑰,因此這個(gè)秘鑰不能公開(kāi),因此對(duì)于需要公開(kāi)秘鑰的場(chǎng)合,我們需要在加密和解密過(guò)程中使用不同的秘鑰,加密使用的公鑰可以公開(kāi),解密使用的私鑰要保密,這就是非對(duì)稱(chēng)加密的好處?!?/div> 2021-06-06最新評(píng)論

