一,C#設計模式:備忘錄模式(Memento Pattern)設計模式
一、發起人角色(Originator):記錄當前時刻的內部狀態,負責建立和恢復備忘錄數據。負責建立一個備忘錄Memento,用以記錄當前時刻自身的內部狀態,並可以使用備忘錄恢復內部狀態。Originator【發起人】能夠根據須要決定Memento【備忘錄】存儲本身的哪些內部狀態。
二、備忘錄角色(Memento):負責存儲發起人對象的內部狀態,在進行恢復時提供給發起人須要的狀態,並能夠防止Originator之外的其餘對象訪問備忘錄。備忘錄有兩個接口:Caretaker【管理角色】只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其餘對象。Originator【發起人】卻可看到備忘錄的寬接口,容許它訪問返回到先前狀態所須要的全部數據。
三、管理者角色(Caretaker):負責保存備忘錄對象。負責備忘錄Memento,不能對Memento的內容進行訪問或者操做。this
二,代碼spa
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace _22.備忘錄模式 { /// <summary> /// 部門--須要備份的數據,是狀態數據,沒有操做 /// </summary> public sealed class Dept { /// <summary> /// 部門 /// </summary> public string DeptName { get; set; } /// <summary> /// 人數 /// </summary> public string Number { get; set; } } /// <summary> /// 發起人--至關於【發起人角色】Originator /// </summary> public sealed class DeptBackOriginator { // 發起人須要保存的內部狀態 private List<Dept> _deptList; public List<Dept> DeptList { get { return this._deptList; } set { this._deptList = value; } } /// <summary> /// 初始化須要備份的部門 /// </summary> /// <param name="deptList"></param> public DeptBackOriginator(List<Dept> deptList) { if (deptList != null) { this._deptList = deptList; } else { throw new ArgumentNullException("參數不能爲空!"); } } /// <summary> /// 建立備忘錄對象實例,將當期要保存的聯繫人列表保存到備忘錄對象中 /// </summary> /// <returns></returns> public DeptMemento CreateMemento() { return new DeptMemento(new List<Dept>(this._deptList)); } /// <summary> /// 將備忘錄中的數據備份還原到部門列表中 /// </summary> /// <param name="memento"></param> public void RestoreMemento(DeptMemento memento) { this.DeptList = memento.DeptListBack; } /// <summary> /// 顯示備份包含的數據 /// </summary> public void Show() { Console.WriteLine("部門列表中共有{0}個部門,他們是:", DeptList.Count); foreach (Dept p in DeptList) { Console.WriteLine("部門: {0} 人數: {1}", p.DeptName, p.Number); } } } /// <summary> /// 備忘錄對象,用於保存狀態數據,保存的是當時對象具體狀態數據--至關於【備忘錄角色】Memeto /// </summary> public sealed class DeptMemento { /// <summary> /// 保存發起人建立的部門數據 /// </summary> public List<Dept> DeptListBack { get; private set; } public DeptMemento(List<Dept> deptList) { DeptListBack = deptList; } } /// <summary> /// 管理角色,它能夠管理【備忘錄】對象,若是是保存多個【備忘錄】對象,固然能夠對保存的對象進行增、刪等管理處理---至關於【管理者角色】Caretaker /// </summary> public sealed class MementoCaretaker { /// <summary> /// 若是想保存多個【備忘錄】對象,經過字典或者堆棧來保存 /// </summary> public Dictionary<string, DeptMemento> DeptMementoDictionary { get; set; } /// <summary> /// 單個備份點 /// </summary> public DeptMemento DeptMemento { get; set; } public MementoCaretaker() { DeptMementoDictionary = new Dictionary<string, DeptMemento>(); } } class Program { static void Main(string[] args) { List<Dept> dept = new List<Dept>() { new Dept() { DeptName="技術部", Number = "15987487456"}, new Dept() { DeptName="人事部", Number = "15987487457"}, new Dept() { DeptName="產品部", Number = "15987487458"} }; #region 單個備份點 //手機名單發起人 DeptBackOriginator mobileOriginator = new DeptBackOriginator(dept); mobileOriginator.Show(); // 建立備忘錄並保存備忘錄對象 MementoCaretaker manager = new MementoCaretaker(); manager.DeptMemento = mobileOriginator.CreateMemento(); ///建立第一個備份點 manager.DeptMementoDictionary.Add("One", mobileOriginator.CreateMemento()); // 更改發起人聯繫人列表 Console.WriteLine("----移除最後一個聯繫人--------"); mobileOriginator.DeptList.RemoveAt(2); mobileOriginator.Show(); ///建立第二個備份點 Thread.Sleep(1000); //等待10秒 manager.DeptMementoDictionary.Add("Two", mobileOriginator.CreateMemento()); // 恢復到原始狀態 Console.WriteLine("-------恢復聯繫人列表------"); mobileOriginator.RestoreMemento(manager.DeptMemento); mobileOriginator.Show(); #endregion #region 多個備份點 Console.WriteLine("-------輸出兩個備份點------"); ////輸出備份點 foreach (var item in manager.DeptMementoDictionary) { mobileOriginator.RestoreMemento(item.Value); mobileOriginator.Show(); } Console.WriteLine("-------恢復到第一個備份點------"); mobileOriginator.RestoreMemento(manager.DeptMementoDictionary["One"]); mobileOriginator.Show(); Console.WriteLine("-------恢復到第二個備份點------"); mobileOriginator.RestoreMemento(manager.DeptMementoDictionary["Two"]); mobileOriginator.Show(); #endregion Console.Read(); } } }