设计模式(十九)—— 备忘录模式
模式簡(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)題。
- 上一篇: WPF 控件库——仿制Windows10
- 下一篇: WPF--动态添加控件、访问控件