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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

asp.net

设计模式(十九)—— 备忘录模式

發(fā)布時(shí)間:2024/1/17 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(十九)—— 备忘录模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

模式簡(jiǎn)介


在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。

很多時(shí)候我們要記錄一個(gè)對(duì)象的內(nèi)部狀態(tài),為了允許用戶撤銷(xiāo)不確定的操作或從錯(cuò)誤中恢復(fù)過(guò)來(lái)。同時(shí),為了不違反封裝的原則,而不能暴露其內(nèi)部狀態(tài)和實(shí)現(xiàn)。想象一下日常生活中我們經(jīng)常會(huì)遇到重置密碼的問(wèn)題,假設(shè)賬號(hào)密碼在初始化后,保留一份備忘錄以便今后重置時(shí)使用,同樣的,我們不能將密碼暴露給其它對(duì)象。這時(shí),可以使用備忘錄模式解決這個(gè)問(wèn)題。

結(jié)構(gòu)分析


UML類(lèi)圖

角色說(shuō)明

  • Memento

備忘錄。存儲(chǔ)原發(fā)器對(duì)象的內(nèi)部狀態(tài),防止原發(fā)器以外的對(duì)象訪問(wèn)備忘錄。

  • Originator

原發(fā)器。提供一個(gè)方法創(chuàng)建備忘錄,用以記錄當(dāng)前時(shí)刻它的內(nèi)部狀態(tài),并提供一個(gè)使用備忘錄恢復(fù)內(nèi)部狀態(tài)的方法。

  • Caretaker

負(fù)責(zé)人。負(fù)責(zé)保存?zhèn)渫?#xff0c;不能對(duì)備忘錄的內(nèi)容進(jìn)行操作或檢查。

工作原理

管理器向原發(fā)器請(qǐng)求一個(gè)備忘錄,保留一段時(shí)間,將其送回原發(fā)器。

結(jié)構(gòu)代碼

//備忘錄 public class Memento {private string _state;public Memento(string state){_state = state;}public string GetState(){return _state;} }//原發(fā)器 public class Originator {public string State { get; set; }public Memento CreateMemento(){return new Memento(State);}public void SetMemento(Memento memento){Console.WriteLine("Restoring state...");State = memento.GetState();} }//負(fù)責(zé)人 public class Caretaker {public Memento Memento { get; set; } }//客戶端調(diào)用 class Program {static void Main(string[] args){Originator originator = new Originator();originator.State = "Off";Caretaker caretaker = new Caretaker();caretaker.Memento = originator.CreateMemento();originator.State = "On";originator.SetMemento(caretaker.Memento);Console.WriteLine(originator.State);Console.ReadLine();} }

程序輸出:

示例分析


本節(jié)通過(guò)一個(gè)重置密碼的示例來(lái)講述備忘錄模式,首先聲明備忘錄Memento。

public class Memento {public string UserName { get; private set; }public string Password { get; private set; }public Memento(string userName,string password){UserName = userName;Password = password;} }

聲明原發(fā)器User,包含UserName和Password屬性,提供CreateMemento方法創(chuàng)建備忘錄,以及SetMemento方法提供重置功能。

public class User {public string UserName { get; set; }public string Password { get; set; }public User(string username,string password){this.UserName = username;this.Password = password;}public Memento CreateMemento(){return new Memento(UserName, Password);}public void SetMemento(Memento memento){this.UserName = memento.UserName;this.Password = memento.Password;} }public class UserMemory {public Memento Memento { get; set; } }

客戶端調(diào)用,創(chuàng)建jack賬號(hào)并創(chuàng)建備忘錄,隨后修改了兩次密碼,最后使用備忘錄進(jìn)行重置。

class Program {static void Main(string[] args){User jack = new User("jack", "12345");UserMemory memory = new UserMemory();memory.Memento = jack.CreateMemento();jack.Password = "23456";jack.Password = "qwert";jack.SetMemento(memory.Memento);Console.WriteLine(jack.Password);Console.ReadLine();} }

使用場(chǎng)景


  • 必須保存某個(gè)對(duì)象在某一時(shí)刻的狀態(tài),以便以后需要時(shí)恢復(fù)到該狀態(tài)。

  • 不希望暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)以至破壞對(duì)象的封裝性。

轉(zhuǎn)載于:https://www.cnblogs.com/Answer-Geng/p/9292773.html

總結(jié)

以上是生活随笔為你收集整理的设计模式(十九)—— 备忘录模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。