Programmering

Sådan bruges Memento-designmønsteret i C #

Vi bruger designmønstre til at løse almindelige designproblemer og reducere kompleksiteten i vores kildekode. Memento-designmønstret er et adfærdsmæssigt designmønster, der kan bruges til at give en fortrydelses- eller tilbageføringsfunktion i en applikation eller simpelthen at nulstille tilstanden til et objekt i en ASP.Net-webapplikation, for eksempel. Ved at gemme et objekts tilstand på et eksternt sted kaldet et Memento tillader dette mønster, at tilstanden gendannes til objektet på et senere tidspunkt. Lad os undersøge, hvordan vi kan bruge Memento-designmønsteret i C #.

Hvert objekt har sin interne tilstand. Et mindesmærke giver os en måde at redde den stat på og gendanne den, mens vi stadig overholder principperne for indkapsling, som dikterer, at ikke-offentlige medlemmer af en instans af en klasse ikke skal være tilgængelige for omverdenen. Dette skyldes, at Memento kun er tilgængeligt for det objekt, hvis tilstand det har gemt.

Deltagerne i Memento-designmønsteret inkluderer et Memento, en originator og en vicevært. Mens Memento-klassen gemmer objektets tilstand, opretter Originator Memento og bruger det til at gendanne tilstanden, når det er nødvendigt. Vagtereren er kun ansvarlig for opbevaring af Memento - det er ikke meningen, at det ændrer Memento-forekomsten.

Implementering af Memento-mønsteret

I dette afsnit implementerer vi Memento-designmønsteret i C #. Vi opretter et simpelt program, der har tre klasser - a Lommeregner klasse, en Memento klasse og klienten, dvs. Vigtigste metode.

Henvis til Lommeregner klasse angivet nedenfor.

  offentlig klasse lommeregner

    {

int-resultat;

offentlig lommeregner (int i = 0)

        {

resultat = 0;

        }

offentlig ugyldighed SetResult (int i = 0)

        {

this.result = 0;

        }

offentlig tomrum Tilføj (int x)

        {

resultat + = x;

        }

public void Subtract (int x)

        {

resultat - = x;

        }

offentlig int GetResult ()

        {

returresultat

        }

offentlig Memento CreateMemento ()

        {

Memento memento = nyt Memento ();

memento.SetState (resultat);

tilbagevenden mindesmærke;

        }

offentlig ugyldighed SaveState (Memento memento)

        {

resultat = memento.GetState ();

        }

    }

Bemærk CreateMemento og SetMemento metoder i Lommeregner klasse. Mens førstnævnte skaber en Momento eksempel henter sidstnævnte den gemte tilstand og tildeler værdien tilbage til resultatvariablen.

Memento-klassen

Det Memento klasse indeholder to metoder, SetState og GetState. Mens førstnævnte bruges til at gemme tilstandsoplysningerne, bruges sidstnævnte til at hente den gemte tilstand.

offentlig klasse Memento

    {

int-tilstand;

offentlig int GetState ()

        {

tilbagevenden tilstand

        }

offentlig ugyldighed SetState (int-tilstand)

        {

denne.tilstand = tilstand;

        }

    }

Klienten i dette eksempel er Vigtigste metode, der opretter en forekomst af Lommeregner klasse og foretager opkald til Tilføje og Trække fra metoder til at udføre beregning. Ud over, Vigtigste gemmer tilstandsoplysningerne ved et bestemt kontrolpunkt ved at foretage et opkald til SaveState metode. Senere gendannes denne gemte tilstand, og værdien af ​​resultatvariablen vises i konsolvinduet. Dette er illustreret i kodestykket nedenfor.

  statisk ugyldigt Main (streng [] args)

        {

Lommeregner = ny Lommeregner ();

lommeregner.Tilføj (5);

lommeregner.Tilføj (10);

lommeregner.Subtraktion (10);

Memento checkPoint = calculator.CreateMemento ();

lommeregner.Tilføj (100);

Console.WriteLine (“Værdien af ​​resultatvariablen er:“ + calculator.GetResult ());

calculator.SaveState (checkPoint);

Console.WriteLine (“Værdien af ​​resultatvariablen ved første kontrolpunkt er:“ + calculator.GetResult ());

Console.Read ();

        }

Det komplette eksempel på Memento-mønster

Her er det komplette program til din reference.

klasse Program

    {

statisk ugyldigt Main (streng [] args)

        {

Lommeregner = ny Lommeregner ();

lommeregner.Tilføj (5);

lommeregner.Tilføj (10);

lommeregner.Subtraktion (10);

Memento checkPoint = calculator.CreateMemento ();

lommeregner.Tilføj (100);

Console.WriteLine (“Værdien af ​​resultatvariablen er:“ + calculator.GetResult ());

calculator.SaveState (checkPoint);

Console.WriteLine (“Værdien af ​​resultatvariablen ved første kontrolpunkt er:“ + calculator.GetResult ());

Console.Read ();

        }

    }

offentlig klasse lommeregner

    {

int-resultat;

offentlig lommeregner (int i = 0)

        {

resultat = 0;

        }

offentlig ugyldighed SetResult (int i = 0)

        {

this.result = 0;

        }

offentlig tomrum Tilføj (int x)

        {

resultat + = x;

        }

public void Subtract (int x)

        {

resultat - = x;

        }

offentlig int GetResult ()

        {

returresultat

        }

offentlig Memento CreateMemento ()

        {

Memento memento = nyt Memento ();

memento.SetState (resultat);

tilbagevenden mindesmærke;

        }

offentlig ugyldighed SetMemento (Memento memento)

        {

resultat = memento.GetState ();

        }

    }

offentlig klasse Memento

    {

int-tilstand;

offentlig int GetState ()

        {

tilbagevenden tilstand

        }

offentlig ugyldighed SetState (int-tilstand)

        {

denne.tilstand = tilstand;

        }

    }

Memento-designmønsteret giver os en praktisk måde at gemme og hente et objekts tilstand på. Du kan drage fordel af dette mønster til at udføre en fortrydelse eller en tilbageførsel. En af ulemperne ved at bruge dette mønster er imidlertid, at processen med at gemme et objekts tilstand og gendanne det senere kan tage lang tid - dvs. det kan være skadeligt for applikationens ydeevne. Så når du bruger Memento-mønsteret, skal du huske at præstere. Endelig skal du også være sikker på, at den indre struktur af dit objekt ikke udsættes for omverdenen.