CSharp: Memento Pattern in donet core 6

 

using Geovin.Du.DuMemento.Conceptual;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuMemento.FoodSupplier
{

    /// <summary>
    /// 備忘錄模式 Memento Pattern亦稱: 快照、Snapshot、Memento
    /// </summary>
    public class FoodSupplier
    {

        /// <summary>
        /// 
        /// </summary>
        private string _name = string.Empty;
        /// <summary>
        /// 
        /// </summary>
        private string _phone = string.Empty;
        /// <summary>
        /// 
        /// </summary>
        private string _address = string.Empty;
        /// <summary>
        /// 
        /// </summary>
        public string Name
        {
            get => _name;
            set
            {
                _name = value;
                Console.WriteLine($"食品供應商:名稱設置爲 {_name}");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public string Phone
        {
            get => _phone;
            set
            {
                _phone = value;
                Console.WriteLine($"食品供應商:電話號碼設置爲 {_phone}");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public string Address
        {
            get => _address;
            set
            {
                _address = value;
                Console.WriteLine($"食品供應商:地址設置爲{_address}");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return $"姓名:{Name} 電話:{Phone} 地址:{ Address}";
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IMemento Save()
        {
            Console.WriteLine("\n食品供應商:保存現狀...");
            return new FoodSupplierMemento(_name, _phone, _address);
        }

        /// <summary>
        /// Restore previous state.
        /// Note that the method returns an IMemento instance in order to to facilitate redo operation.
        /// The return type can be changed to void if redo doesn't have to be supported.
        /// </summary>
        /// <param name="memento">Memento for restoration.</param>
        /// <returns>Redo memento.</returns>
        public IMemento Restore(IMemento memento)
        {
            Console.WriteLine("\n食品供應商:恢復狀態...");

            if (memento is not FoodSupplierMemento foodSupplierMemento)
            {
                throw new ArgumentException($"未知的紀念品: {memento}");
            }

            var redoMemento = new FoodSupplierMemento(_name, _phone, _address);

            Name = foodSupplierMemento.Name;
            Phone = foodSupplierMemento.PhoneNumber;
            Address = foodSupplierMemento.Address;

            return redoMemento;
        }
    }

}


using Geovin.Du.DuMemento.Conceptual;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuMemento.FoodSupplier
{

    /// <summary>
    /// 備忘錄模式 Memento Pattern亦稱: 快照、Snapshot、Memento
    /// </summary>
    public class SupplierRegistry
    {

        /// <summary>
        /// 
        /// </summary>
        private readonly FoodSupplier _supplier;
        /// <summary>
        /// 
        /// </summary>
        private readonly Stack<IMemento> _undoStack;
        /// <summary>
        /// 
        /// </summary>
        private readonly Stack<IMemento> _redoStack;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="supplier"></param>
        public SupplierRegistry(FoodSupplier supplier)
        {
            _supplier = supplier;
            _undoStack = new Stack<IMemento>();
            _redoStack = new Stack<IMemento>();
        }
        /// <summary>
        /// 
        /// </summary>
        public void Backup()
        {
            Console.WriteLine("\n供應商註冊表:備份操作..");

            _redoStack.Clear();
            _undoStack.Push(_supplier.Save());
        }
        /// <summary>
        /// 
        /// </summary>
        public void Undo()
        {
            Console.WriteLine("\n供應商註冊表:正在執行撤銷操作...");

            var top = _undoStack.Pop();
            _redoStack.Push(_supplier.Restore(top));
        }
        /// <summary>
        /// 
        /// </summary>
        public void Redo()
        {
            Console.WriteLine("\n供應商註冊表:執行重做操作...");

            var top = _redoStack.Pop();
            _undoStack.Push(_supplier.Restore(top));
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuMemento.FoodSupplier
{

    /// <summary>
    /// 備忘錄模式 Memento Pattern亦稱: 快照、Snapshot、Memento
    /// </summary>
    public interface IMemento
    {
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuMemento.FoodSupplier
{

    /// <summary>
    /// 備忘錄模式 Memento Pattern亦稱: 快照、Snapshot、Memento
    /// </summary>
    public class FoodSupplierMemento : IMemento
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="name"></param>
        /// <param name="phoneNumber"></param>
        /// <param name="address"></param>
        public FoodSupplierMemento(string name, string phoneNumber, string address)
        {
            Name = name;
            PhoneNumber = phoneNumber;
            Address = address;
        }
        /// <summary>
        /// 
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// /
        /// </summary>
        public string PhoneNumber { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string Address { get; set; }
    }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Geovin.Du.BuildingBlocks;


namespace Geovin.Du.DuMemento.FoodSupplier
{

    /// <summary>
    /// 備忘錄模式 Memento Pattern亦稱: 快照、Snapshot、Memento
    /// </summary>
    public static class FoodSupplierExecutor
    {


        /// <summary>
        /// 
        /// </summary>
        public static void Execute()
        {
            ConsoleExtension.WriteSeparator("\n備忘錄模式 Memento Pattern 食物供應 Food supplier demo");

            var foodSupplier = new FoodSupplier
            {
                Name = "塗氏食品工業公司",
                Phone = "8888 1111",
                Address = "深圳市羅湖區",
            };

            var registry = new SupplierRegistry(foodSupplier);
            registry.Backup();

            foodSupplier.Phone = "8888 2222";

            registry.Undo();
            registry.Redo();
        }
    }
}

  

 

調用:

Geovin.Du.DuMemento.FoodSupplier.FoodSupplierExecutor.Execute();

  

輸出:

備忘錄模式 Memento Pattern 食物供應 Food supplier demo
--------------------------------------------------
食品供應商:名稱設置爲 塗氏食品工業公司
食品供應商:電話號碼設置爲 8888 1111
食品供應商:地址設置爲深圳市羅湖區

供應商註冊表:備份操作..

食品供應商:保存現狀...
食品供應商:電話號碼設置爲 8888 2222

供應商註冊表:正在執行撤銷操作...

食品供應商:恢復狀態...
食品供應商:名稱設置爲 塗氏食品工業公司
食品供應商:電話號碼設置爲 8888 1111
食品供應商:地址設置爲深圳市羅湖區

供應商註冊表:執行重做操作...

食品供應商:恢復狀態...
食品供應商:名稱設置爲 塗氏食品工業公司
食品供應商:電話號碼設置爲 8888 2222
食品供應商:地址設置爲深圳市羅湖區

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章