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.