Как да използвам шаблона за дизайн на Memento в C #

Използваме дизайнерски модели за решаване на често срещани дизайнерски проблеми и намаляване на сложността в нашия изходен код. Шаблонът за проектиране на Memento е модел на поведенчески дизайн, който може да се използва за предоставяне на възможност за отмяна или връщане в приложение или просто за нулиране на състоянието на обект в уеб приложение на ASP.Net, например. Чрез съхраняване на състоянието на обекта във външно място, наречено Memento, този модел позволява това състояние да бъде възстановено в обекта по-късно. Нека да проучим как можем да използваме шаблона за дизайн на Memento в C #.

Всеки обект има своето вътрешно състояние. A Memento ни дава начин да спасим това състояние и да го възстановим, като същевременно спазваме принципите на капсулиране, които диктуват, че непублични членове на даден екземпляр от клас не трябва да бъдат достъпни за външния свят. Това е така, защото Memento е достъпен само за обекта, чието състояние е съхранил.

Участниците в модела за дизайн на Memento включват Memento, Originator и Caretaker. Докато класът Memento съхранява състоянието на обекта, Originator създава Memento и го използва за възстановяване на състоянието, когато е необходимо. Служителят е отговорен само за съхранението на Memento - не трябва да променя екземпляра на Memento. 

Прилагане на модела Memento 

В този раздел ще внедрим шаблона за дизайн на Memento в C #. Ще създадем проста програма, която има три класа - Calculatorклас, Mementoклас и клиента, т.е. Mainметода.

Обърнете се към Calculatorкласа, даден по-долу.

    публичен клас Калкулатор

    {

        int резултат;

        публичен калкулатор (int i = 0)

        {

            резултат = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        публична невалидност Добавяне (int x)

        {

            резултат + = x;

        }

        публично невалидно изваждане (int x)

        {

            резултат - = x;

        }

        публичен int GetResult ()

        {

            връщане на резултат;

        }

        публичен спомен Създай спомен ()

        {

            Memento memento = нов Memento ();

            memento.SetState (резултат);

            връщане спомен;

        }

        публична празнина SaveState (Спомен за спомен)

        {

            резултат = memento.GetState ();

        }

    }

Обърнете внимание на CreateMementoи SetMementoметодите в Calculatorкласа. Докато първият създава Momentoекземпляр, вторият извлича запазеното състояние и присвоява стойността обратно на резултантната променлива.

Класът Memento

В Mementoклас съдържа два метода, SetStateи GetState. Докато първият се използва за съхраняване на информация за състоянието, вторият се използва за извличане на запазеното състояние.

обществена класа Memento

    {

        вътрешно състояние;

        публичен int GetState ()

        {

            състояние на връщане;

        }

        публична невалидна SetState (вътрешно състояние)

        {

            this.state = състояние;

        }

    }

Клиентът в този пример е Mainметодът, който създава екземпляр на Calculatorкласа и прави извиквания към Addи Subtractметодите за извършване на изчисления. Освен това Mainзапазва информацията за състоянието в определен контролен пункт, като извиква SaveStateметода. По-късно това запазено състояние се възстановява и стойността на променливата на резултата се показва в прозореца на конзолата. Това е илюстрирано в кодовия фрагмент, даден по-долу.

        static void Main (низ [] аргументи)

        {

            Калкулатор на калкулатора = нов калкулатор ();

            калкулатор.Добави (5);

            калкулатор.Добави (10);

            калкулатор.Изваждане (10);

            Memento checkPoint = калкулатор.CreateMemento ();

            калкулатор.Добави (100);

            Console.WriteLine („Стойността на променливата на резултата е:“ + калкулатор.GetResult ());

            calculator.SaveState (checkPoint);

            Console.WriteLine („Стойността на променливата на резултата при първата контролна точка е:„ + калкулатор.GetResult ());

            Console.Read ();

        }

Пълният пример за модел на Memento

Ето пълната програма за справка.

клас Програма

    {

        static void Main (низ [] аргументи)

        {

            Калкулатор на калкулатора = нов калкулатор ();

            калкулатор.Добави (5);

            калкулатор.Добави (10);

            калкулатор.Изваждане (10);

            Memento checkPoint = калкулатор.CreateMemento ();

            калкулатор.Добави (100);

            Console.WriteLine („Стойността на променливата на резултата е:“ + калкулатор.GetResult ());

            calculator.SaveState (checkPoint);

            Console.WriteLine („Стойността на променливата на резултата при първата контролна точка е:„ + калкулатор.GetResult ());

            Console.Read ();

        }

    }

    публичен клас Калкулатор

    {

        int резултат;

        публичен калкулатор (int i = 0)

        {

            резултат = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        публична невалидност Добавяне (int x)

        {

            резултат + = x;

        }

        публично невалидно изваждане (int x)

        {

            резултат - = x;

        }

        публичен int GetResult ()

        {

            връщане на резултат;

        }

        публичен спомен Създай спомен ()

        {

            Memento memento = нов Memento ();

            memento.SetState (резултат);

            връщане спомен;

        }

        публична празнота SetMemento (Спомен за спомен)

        {

            резултат = memento.GetState ();

        }

    }

    обществена класа Memento

    {

        вътрешно състояние;

        публичен int GetState ()

        {

            състояние на връщане;

        }

        публична невалидна SetState (вътрешно състояние)

        {

            this.state = състояние;

        }

    }

Шаблонът за дизайн на Memento ни дава удобен начин за съхраняване и извличане на състоянието на обекта. Можете да се възползвате от този модел, за да извършите отмяна или връщане назад. Един от недостатъците на използването на този модел обаче е, че процесът на запазване на състоянието на даден обект и възстановяването му по-късно може да отнеме доста време - т.е. той може да навреди на производителността на приложението. Така че, когато използвате модела Memento, не забравяйте да имате предвид производителността. И накрая, уверете се също, че вътрешната структура на вашия обект не е изложена на външния свят.