C#設計模式:備忘錄模式(Memento Pattern)

一,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();
        }
    }
}
相關文章
相關標籤/搜索