Ohjelmointi

Memento-mallin käyttäminen C #: ssä

Käytämme suunnittelumalleja ratkaisemaan yleisiä suunnitteluongelmia ja vähentämään lähdekoodimme monimutkaisuutta. Memento-mallikuvio on käyttäytymiskuvio, jota voidaan käyttää tarjoamaan kumoamis- tai palautusominaisuus sovelluksessa tai yksinkertaisesti palauttamaan objektin tila esimerkiksi ASP.Net-verkkosovelluksessa. Tallentamalla objektin tilan ulkoiseen sijaintiin, jota kutsutaan Mementoksi, tämä malli antaa tilan palauttaa objektille myöhemmin. Tutkitaan, miten voimme käyttää Memento-suunnittelukuviota C #: ssä.

Jokaisella esineellä on sisäinen tila. Muistoesine antaa meille tavan pelastaa kyseinen tila ja palauttaa se samalla noudattaen kapseloinnin periaatteita, jotka sanelevat, että luokan esiintymän ei-julkiset jäsenet eivät saa olla ulkomaailman saatavilla. Tämä johtuu siitä, että Memento on käytettävissä vain objektille, jonka tilan se on tallentanut.

Memento-mallin osallistujat ovat Memento, Originator ja Caretaker. Vaikka Memento-luokka tallentaa objektin tilan, Originator luo Mementon ja käyttää sitä tilanteen palauttamiseen tarvittaessa. Talonmies on vastuussa vain Mementon tallentamisesta - sen ei ole tarkoitus muuttaa Memento-esiintymää.

Memento-mallin toteuttaminen

Tässä osassa toteutamme Memento-suunnittelumallin C # -merkillä. Luomme yksinkertaisen ohjelman, jossa on kolme luokkaa - a Laskin luokka, a Memento luokka ja asiakas eli Main menetelmä.

Viittaavat Laskin luokassa.

  julkisen luokan laskin

    {

int tulos;

julkinen laskin (int i = 0)

        {

tulos = 0;

        }

public void SetResult (int i = 0)

        {

tämä.tulos = 0;

        }

public void Lisää (int x)

        {

tulos + = x;

        }

public void Vähennä (int x)

        {

tulos - = x;

        }

julkinen int GetResult ()

        {

paluutulos;

        }

julkinen Memento CreateMemento ()

        {

Memento memento = uusi muisto ();

memento.SetState (tulos);

palautusmuisto;

        }

public void SaveState (Memento memento)

        {

tulos = memento.GetState ();

        }

    }

Huomaa CreateMemento ja SetMemento menetelmät Laskin luokassa. Vaikka entinen luo Momento esimerkiksi jälkimmäinen hakee tallennetun tilan ja määrittää arvon takaisin tulosmuuttujalle.

Memento-luokka

Memento luokka sisältää kaksi menetelmää, SetState ja GetState. Ensimmäistä käytetään tilatietojen tallentamiseen, jälkimmäistä käytetään tallennetun tilan hakemiseen.

julkinen luokka Memento

    {

int-tila;

julkinen int GetState ()

        {

paluutila;

        }

public void SetState (int tila)

        {

tämä.tila = osavaltio;

        }

    }

Tässä esimerkissä asiakas on Main menetelmä, joka luo Laskin luokka ja soittaa Lisätä ja Vähentää menetelmiä laskennan suorittamiseksi. Lisäksi, Main tallentaa tilatiedot tietylle tarkistuspisteelle soittamalla SaveState menetelmä. Myöhemmin tämä tallennettu tila palautetaan ja tulosmuuttujan arvo näkyy konsoli-ikkunassa. Tätä kuvaa alla oleva koodinpätkä.

  staattinen void Main (merkkijono [] args)

        {

Laskimen laskin = uusi Laskin ();

laskin.Lisää (5);

laskin.Lisää (10);

laskin.Ote (10);

Memento checkPoint = laskin.CreateMemento ();

laskin.Lisää (100);

Console.WriteLine ("Tulosmuuttujan arvo on:" + calculator.GetResult ());

laskin.SaveState (checkPoint);

Console.WriteLine ("Tulosmuuttujan arvo ensimmäisessä tarkistuspisteessä on:" + calculator.GetResult ());

Konsoli.Lue ();

        }

Täydellinen esimerkki Memento-mallista

Tässä on täydellinen ohjelma viitteellesi.

luokan ohjelma

    {

staattinen void Main (merkkijono [] args)

        {

Laskimen laskin = uusi Laskin ();

laskin.Lisää (5);

laskin.Lisää (10);

laskin.Ote (10);

Memento checkPoint = laskin.CreateMemento ();

laskin.Lisää (100);

Console.WriteLine ("Tulosmuuttujan arvo on:" + calculator.GetResult ());

laskin.SaveState (checkPoint);

Console.WriteLine ("Tulosmuuttujan arvo ensimmäisessä tarkistuspisteessä on:" + calculator.GetResult ());

Konsoli.Lue ();

        }

    }

julkisen luokan laskin

    {

int tulos;

julkinen laskin (int i = 0)

        {

tulos = 0;

        }

public void SetResult (int i = 0)

        {

tämä.tulos = 0;

        }

public void Lisää (int x)

        {

tulos + = x;

        }

public void Vähennä (int x)

        {

tulos - = x;

        }

julkinen int GetResult ()

        {

paluutulos;

        }

julkinen Memento CreateMemento ()

        {

Memento memento = uusi muisto ();

memento.SetState (tulos);

palautusmuisto;

        }

julkinen mitätöinti SetMemento (Memento memento)

        {

tulos = memento.GetState ();

        }

    }

julkinen luokka Memento

    {

int-tila;

julkinen int GetState ()

        {

paluutila;

        }

public void SetState (int tila)

        {

tämä.tila = osavaltio;

        }

    }

Memento-mallikuvio antaa meille kätevän tavan tallentaa ja noutaa kohteen tila. Voit hyödyntää tätä mallia kumoamiseksi tai palauttamiseksi. Yksi tämän mallin käytön haittapuolista on kuitenkin se, että objektin tilan tallentaminen ja sen palauttaminen myöhemmin voi viedä jonkin aikaa - ts. Se voi olla haitallista sovelluksen suorituskyvylle. Joten, kun käytät Memento-mallia, muista pitää suorituskyky mielessä. Lopuksi, varmista myös, että esineesi sisäinen rakenne ei ole alttiina ulkomaailmalle.