• CSharp: Memento Pattern in donet core 3


        /// <summary>
        ///  备忘录模式 Memento Pattern  亦称: 快照、Snapshot、Memento
        ///  geovindu,Geovin Du edit
        /// </summary>    
        class Originator
        {
    
            /// <summary>
            /// 状态
            /// </summary>
            private string state;
            /// <summary>
            /// Memento myMemento;//not needed now
            /// </summary>
            public Originator()
            {
                //Creating a memento with born state.
                state = "快照 #0.(出生状态)";
                Console.WriteLine($"发起人的当前状态是: {state}");
    
            }
            /// <summary>
            /// 状态
            /// </summary>
            public string State
            {
                get { return state; }
                set
                {
                    state = value;
                    Console.WriteLine($"发起人的的当前状态是: {state}");
                }
            }
    
    
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public Memento CurrentMemento()
            {
                //Code segment used in Demonstration-1
                //myMemento = new Memento();//error now, because of private constructor
                //myMemento.State = state;
                //return myMemento;
    
                //Modified code for Demonstration-2
                return new Memento(this.State);
            }
    
            /// <summary>
            /// Back to an old state (Restore)
            /// </summary>
            /// <param name="restoreMemento"></param>
            public void RestoreMemento(Memento restoreMemento)
            {
                this.state = restoreMemento.State;
                //Console.WriteLine("Restored to state : {0}", state);
                Console.WriteLine($"愎复状态是: {state}");
            }
            /// <summary>
            /// Memento class
            /// </summary>
            internal class Memento        
            {
                /// <summary>
                /// 
                /// </summary>
                private string state;
                //Now Memento class cannot be initialized outside
                /// <summary>
                /// 
                /// </summary>
                private Memento() { }
                /// <summary>
                /// 
                /// </summary>
                /// <param name="state">输入状态</param>
                public Memento(string state)
                {
                    this.state = state;
                }
                /// <summary>
                /// 
                /// </summary>
                public string State
                {
                    get
                    {
                        return state;
                    }
                    set
                    {
                        state = value;
                    }
                }
            }
    
        }
    

      

      /// <summary>
        ///  备忘录模式 Memento Pattern  亦称: 快照、Snapshot、Memento
        ///  geovindu,Geovin Du edit
        /// </summary>
        public class Memento
        {
    
            /// <summary>
            /// 
            /// </summary>
            public int Balance { get; }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="balance"></param>
            public Memento(int balance)
            {
                Balance = balance;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public class BankAccount // supports undo/redo
        {
            /// <summary>
            /// 
            /// </summary>
            private int balance;
            /// <summary>
            /// 
            /// </summary>
            private List<Memento> changes = new List<Memento>();
            /// <summary>
            /// 
            /// </summary>
            private int current;
            /// <summary>
            /// 
            /// </summary>
            /// <param name="balance"></param>
            public BankAccount(int balance)
            {
                this.balance = balance;
                changes.Add(new Memento(balance));
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="amount"></param>
            /// <returns></returns>
            public Memento Deposit(int amount)
            {
                balance += amount;
                var m = new Memento(balance);
                changes.Add(m);
                ++current;
                return m;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="m"></param>
            public void Restore(Memento m)
            {
                if (m != null)
                {
                    balance = m.Balance;
                    changes.Add(m);
                    current = changes.Count - 1;
                }
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public Memento Undo()
            {
                if (current > 0)
                {
                    var m = changes[--current];
                    balance = m.Balance;
                    return m;
                }
                return null;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public Memento Redo()
            {
                if (current + 1 < changes.Count)
                {
                    var m = changes[++current];
                    balance = m.Balance;
                    return m;
                }
                return null;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return $"{nameof(balance)}: {balance}";
            }
        }
    

      

    调用:

         //备忘录模式
                 Originator originatorObject;
                 Originator.Memento currentMemento;
    
                Console.WriteLine("***备忘录模式Memento Pattern Demonstration-2.***");
                Console.WriteLine("发起人 (带有嵌套的内部类“Memento”)在一个单独的文件中维护.\n");
    
                originatorObject = new Originator();            
    
    
                IList<Originator.Memento> savedStates = new List<Originator.Memento>();
                /* 
                 Adding a memento the list.This memento stores
                 the current state of the Origintor.
                */
                savedStates.Add(originatorObject.CurrentMemento());
    
                //Snapshot #1.
                originatorObject.State = "快照 #1";
                //Adding this memento as a  restore point            
                savedStates.Add(originatorObject.CurrentMemento());
    
    
                //Snapshot #2.
                originatorObject.State = "快照 #2";
                //Adding this memento as a  restore point            
                savedStates.Add(originatorObject.CurrentMemento());
    
                //Snapshot #3.
                originatorObject.State = "快照 #3";
                //Adding this memento as a  restore point            
                savedStates.Add(originatorObject.CurrentMemento());
    
                //Snapshot #4. It is not added as a restore point.
                originatorObject.State = "快照 #4";
    
                //Available restore points
                Console.WriteLine("\n当前可用的恢复点为 :");
                foreach (Originator.Memento m in savedStates)
                {
                    Console.WriteLine(m.State);
                }
    
                //Undo's
                //Roll back starts...            
                Console.WriteLine("\n现在执行撤销.");
                for (int i = savedStates.Count; i > 0; i--)
                {
                    //Get a restore point
                    currentMemento = savedStates[i - 1];
                    originatorObject.RestoreMemento(currentMemento);
                }
                //Redo's
                Console.WriteLine("\n现在执行重做.");
                for (int i = 1; i < savedStates.Count; i++)
                {
                    currentMemento = savedStates[i];
                    originatorObject.RestoreMemento(currentMemento);
                }
    
                Console.WriteLine();
    
                var ba = new BankAccount(100);
                ba.Deposit(50);
                ba.Deposit(25);
                Console.WriteLine(ba);
    
                ba.Undo();
                Console.WriteLine($"Undo geovindu #1: {ba}");
                ba.Undo();
                Console.WriteLine($"Undo geovindu #2: {ba}");
                ba.Redo();
                Console.WriteLine($"Redo geovindu #2: {ba}");
    
    
                Console.ReadKey();
    

      

    输出:

    ***备忘录模式Memento Pattern Demonstration-2.***
    发起人 (带有嵌套的内部类“Memento”)在一个单独的文件中维护.
    
    发起人的当前状态是: 快照 #0.(出生状态)
    发起人的的当前状态是: 快照 #1
    发起人的的当前状态是: 快照 #2
    发起人的的当前状态是: 快照 #3
    发起人的的当前状态是: 快照 #4
    
    当前可用的恢复点为 :
    快照 #0.(出生状态)
    快照 #1
    快照 #2
    快照 #3
    
    现在执行撤销.
    愎复状态是: 快照 #3
    愎复状态是: 快照 #2
    愎复状态是: 快照 #1
    愎复状态是: 快照 #0.(出生状态)
    
    现在执行重做.
    愎复状态是: 快照 #1
    愎复状态是: 快照 #2
    愎复状态是: 快照 #3
    
    balance: 175
    Undo geovindu #1: balance: 150
    Undo geovindu #2: balance: 100
    Redo geovindu #2: balance: 150
    

      

  • 相关阅读:
    JavaWeb之Ajax快速入门(十九)
    JavaWeb之文件上传与下载&邮件技术(十八)
    JavaWeb之Filter快速入门(十七)
    JavaWeb之JDBC分页/监听器(十六)
    JavaWeb之JDBC&自定义框架/DBUtil(十五)
    JavaWeb之JDBC(十四)
    JavaWeb之JDBC学习(十三)
    JavaWeb之Mysql代码练习(十二)
    [ 校内OJ ] NOIP2019模拟赛(五)
    【一本通】欧拉回路
  • 原文地址:https://www.cnblogs.com/geovindu/p/16777588.html
Copyright © 2020-2023  润新知