Vi bruker designmønstre for å løse vanlige designproblemer og redusere kompleksiteten i kildekoden. Memento designmønsteret er et atferdsmønster som kan brukes til å gi en angre- eller tilbakeføringsfunksjon i et program, eller bare for å tilbakestille tilstanden til et objekt i en ASP.Net-webapplikasjon, for eksempel. Ved å lagre et objekts tilstand til et eksternt sted kalt Memento, gjør dette mønsteret det mulig å gjenopprette tilstanden til objektet på et senere tidspunkt. La oss utforske hvordan vi kan bruke Memento-designmønsteret i C #.
Hvert objekt har sin indre tilstand. Et minne gir oss en måte å redde den staten og gjenopprette den mens vi fortsatt overholder prinsippene for innkapsling, som tilsier at ikke-offentlige medlemmer av en forekomst av en klasse ikke skal være tilgjengelig for omverdenen. Dette er fordi Memento bare er tilgjengelig for objektet hvis tilstand det har lagret.
Deltakerne i Memento-designmønsteret inkluderer et Memento, en opphavsmann og en vaktmester. Mens Memento-klassen lagrer tilstanden til objektet, oppretter Oppretteren Memento og bruker den til å gjenopprette tilstanden når det er nødvendig. Vaktmesteren er kun ansvarlig for lagring av Memento-det er ikke ment å endre Memento-forekomsten.
Implementering av Memento-mønsteret
I denne delen vil vi implementere Memento designmønsteret i C #. Vi vil lage et enkelt program som har tre klasser - a Kalkulator
klasse, en Minne
klassen, og klienten, dvs. Hoved
metode.
Referere til Kalkulator
klasse gitt nedenfor.
offentlig klasse Kalkulator{
int resultat;
offentlig kalkulator (int i = 0)
{
resultat = 0;
}
offentlig ugyldig SetResult (int i = 0)
{
this.result = 0;
}
offentlig tomrom Legg til (int x)
{
resultat + = x;
}
public void Subtract (int x)
{
resultat - = x;
}
offentlig int GetResult ()
{
returresultat;
}
offentlig Memento CreateMemento ()
{
Memento memento = nytt Memento ();
memento.SetState (resultat);
tilbake minnesmerke;
}
offentlig ugyldig SaveState (Memento memento)
{
resultat = memento.GetState ();
}
}
Legg merke til CreateMemento
og SetMemento
metoder i Kalkulator
klasse. Mens førstnevnte skaper en Momento
for eksempel henter sistnevnte den lagrede tilstanden og tilordner verdien tilbake til resultatvariabelen.
Memento-klassen
De Minne
klasse inneholder to metoder, SetState
og GetState
. Mens førstnevnte brukes til å lagre tilstandsinformasjonen, brukes sistnevnte til å hente den lagrede tilstanden.
offentlig klasse Memento{
int-tilstand;
offentlig int GetState ()
{
returstatus;
}
offentlig ugyldig SetState (int-tilstand)
{
this.state = state;
}
}
Klienten i dette eksemplet er Hoved
metode som skaper en forekomst av Kalkulator
klasse og ringer til Legge til
og Trekke fra
metoder for å utføre beregning. I tillegg, Hoved
lagrer tilstandsinformasjonen ved et bestemt kontrollpunkt ved å ringe til SaveState
metode. Senere gjenopprettes denne lagrede tilstanden og verdien av resultatvariabelen vises i konsollvinduet. Dette er illustrert i kodebiten gitt nedenfor.
statisk tomrom Main (streng [] args){
Kalkulator kalkulator = ny Kalkulator ();
kalkulator.Legg til (5);
kalkulator.Legg til (10);
kalkulator.Trekk (10);
Memento checkPoint = kalkulator.CreateMemento ();
kalkulator.Legg til (100);
Console.WriteLine (“Verdien av resultatvariabelen er:“ + calculator.GetResult ());
kalkulator.SaveState (checkPoint);
Console.WriteLine (“Verdien av resultatvariabelen ved første kontrollpunkt er:“ + calculator.GetResult ());
Console.Read ();
}
Det komplette eksemplet på Memento-mønster
Her er det komplette programmet for din referanse.
klasse Program{
statisk tomrom Main (streng [] args)
{
Kalkulator kalkulator = ny Kalkulator ();
kalkulator.Legg til (5);
kalkulator.Legg til (10);
kalkulator.Trekk (10);
Memento checkPoint = kalkulator.CreateMemento ();
kalkulator.Legg til (100);
Console.WriteLine (“Verdien av resultatvariabelen er:“ + calculator.GetResult ());
kalkulator.SaveState (checkPoint);
Console.WriteLine (“Verdien av resultatvariabelen ved første kontrollpunkt er:“ + calculator.GetResult ());
Console.Read ();
}
}
offentlig klasse Kalkulator
{
int resultat;
offentlig kalkulator (int i = 0)
{
resultat = 0;
}
offentlig ugyldig SetResult (int i = 0)
{
this.result = 0;
}
offentlig tomrom Legg til (int x)
{
resultat + = x;
}
public void Subtract (int x)
{
resultat - = x;
}
offentlig int GetResult ()
{
returresultat;
}
offentlig Memento CreateMemento ()
{
Memento memento = nytt Memento ();
memento.SetState (resultat);
tilbake minnesmerke;
}
offentlig ugyldighet SetMemento (Memento memento)
{
resultat = memento.GetState ();
}
}
offentlig klasse Memento
{
int-tilstand;
offentlig int GetState ()
{
returstatus;
}
offentlig ugyldig SetState (int-tilstand)
{
this.state = state;
}
}
Memento designmønsteret gir oss en praktisk måte å lagre og hente gjenstandens tilstand på. Du kan dra nytte av dette mønsteret for å utføre en angre eller tilbakestilling. En av ulempene ved å bruke dette mønsteret er imidlertid at prosessen med å lagre et objekts tilstand og gjenopprette det senere kan ta ganske lang tid - det vil si at det kan være skadelig for applikasjonens ytelse. Så når du bruker Memento-mønsteret, må du huske på ytelsen. Til slutt, vær også sikker på at den indre strukturen til objektet ikke blir utsatt for omverdenen.