设计模式(十九)—— 备忘录模式
模式簡介
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
很多時候我們要記錄一個對象的內部狀態,為了允許用戶撤銷不確定的操作或從錯誤中恢復過來。同時,為了不違反封裝的原則,而不能暴露其內部狀態和實現。想象一下日常生活中我們經常會遇到重置密碼的問題,假設賬號密碼在初始化后,保留一份備忘錄以便今后重置時使用,同樣的,我們不能將密碼暴露給其它對象。這時,可以使用備忘錄模式解決這個問題。
結構分析
UML類圖
角色說明
- Memento
備忘錄。存儲原發器對象的內部狀態,防止原發器以外的對象訪問備忘錄。
- Originator
原發器。提供一個方法創建備忘錄,用以記錄當前時刻它的內部狀態,并提供一個使用備忘錄恢復內部狀態的方法。
- Caretaker
負責人。負責保存備忘錄,不能對備忘錄的內容進行操作或檢查。
工作原理
管理器向原發器請求一個備忘錄,保留一段時間,將其送回原發器。
結構代碼
//備忘錄 public class Memento {private string _state;public Memento(string state){_state = state;}public string GetState(){return _state;} }//原發器 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();} }//負責人 public class Caretaker {public Memento Memento { get; set; } }//客戶端調用 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();} }程序輸出:
示例分析
本節通過一個重置密碼的示例來講述備忘錄模式,首先聲明備忘錄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;} }聲明原發器User,包含UserName和Password屬性,提供CreateMemento方法創建備忘錄,以及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; } }客戶端調用,創建jack賬號并創建備忘錄,隨后修改了兩次密碼,最后使用備忘錄進行重置。
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();} }使用場景
必須保存某個對象在某一時刻的狀態,以便以后需要時恢復到該狀態。
不希望暴露對象的實現細節以至破壞對象的封裝性。
轉載于:https://www.cnblogs.com/Answer-Geng/p/9292773.html
總結
以上是生活随笔為你收集整理的设计模式(十九)—— 备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 控件库——仿制Windows10
- 下一篇: WPF--动态添加控件、访问控件