K řešení běžných návrhových problémů a snížení složitosti našeho zdrojového kódu používáme návrhové vzory. Návrhový vzor Memento je návrhový vzor chování, který lze použít k poskytnutí možnosti vrácení nebo vrácení zpět v aplikaci nebo jednoduše k resetování stavu objektu například ve webové aplikaci ASP.Net. Uložením stavu objektu do externího umístění zvaného Memento umožňuje tento vzor tento stav obnovit v objektu později. Prozkoumejme, jak můžeme použít návrhový vzor Memento v C #.
Každý objekt má svůj vnitřní stav. Memento nám dává způsob, jak tento stát zachránit a obnovit, a přitom stále dodržovat zásady zapouzdření, které diktují, že neveřejní členové instance třídy by neměli být k dispozici vnějšímu světu. Důvodem je, že Memento je k dispozici pouze pro objekt, jehož stav má uložený.
Mezi účastníky návrhového vzoru Memento patří Memento, Původce a Správce. Zatímco třída Memento ukládá stav objektu, Originator vytvoří Memento a podle potřeby jej použije k obnovení stavu. Správce je odpovědný pouze za ukládání Mementa - nemá to měnit instanci Mementa.
Implementace vzoru Memento
V této části implementujeme návrhový vzor Memento v C #. Vytvoříme jednoduchý program, který má tři třídy - a Kalkulačka
třída, a Memento
třída a klient, tj Hlavní
metoda.
Odkazovat na Kalkulačka
třída uvedená níže.
kalkulačka veřejné třídy{
int výsledek;
veřejná kalkulačka (int i = 0)
{
výsledek = 0;
}
public void SetResult (int i = 0)
{
this.result = 0;
}
public void Přidat (int x)
{
výsledek + = x;
}
public void Odečíst (int x)
{
výsledek - = x;
}
public int GetResult ()
{
vrátit výsledek;
}
veřejné Memento CreateMemento ()
{
Memento memento = nové Memento ();
memento.SetState (výsledek);
návratové upomínkové předměty;
}
public void SaveState (Memento memento)
{
result = memento.GetState ();
}
}
Všimněte si CreateMemento
a SetMemento
metody v Kalkulačka
třída. Zatímco první vytváří a Momento
instance načte uložený stav a přiřadí hodnotu zpět výsledné proměnné.
Třída Memento
The Memento
třída obsahuje dvě metody, SetState
a GetState
. Zatímco první se používá k ukládání informací o stavu, druhá se používá k načtení uloženého stavu.
veřejná třída Memento{
int stav;
public int GetState ()
{
návratový stav;
}
public void SetState (int state)
{
this.state = state;
}
}
Klientem v tomto příkladu je Hlavní
metoda, která vytvoří instanci Kalkulačka
třídy a volá do Přidat
a Odčítat
metody provádění výpočtu. Navíc, Hlavní
uloží informace o stavu na určitém kontrolním bodě zavoláním na SaveState
metoda. Později se tento uložený stav obnoví a hodnota výsledné proměnné se zobrazí v okně konzoly. To je znázorněno na fragmentu kódu uvedeném níže.
static void Main (řetězec [] args){
Kalkulačka kalkulačka = nová kalkulačka ();
kalkulačka. Přidat (5);
kalkulačka. Přidat (10);
calculator.Subtract (10);
Memento checkPoint = calculator.CreateMemento ();
kalkulačka. Přidat (100);
Console.WriteLine („Hodnota výsledné proměnné je:“ + calculator.GetResult ());
calculator.SaveState (checkPoint);
Console.WriteLine („Hodnota výsledné proměnné na prvním kontrolním bodě je:“ + calculator.GetResult ());
Console.Read ();
}
Kompletní příklad vzoru Memento
Zde je kompletní program pro vaši referenci.
třídní program{
static void Main (řetězec [] args)
{
Kalkulačka kalkulačka = nová kalkulačka ();
kalkulačka. Přidat (5);
kalkulačka. Přidat (10);
calculator.Subtract (10);
Memento checkPoint = calculator.CreateMemento ();
kalkulačka. Přidat (100);
Console.WriteLine („Hodnota výsledné proměnné je:“ + calculator.GetResult ());
calculator.SaveState (checkPoint);
Console.WriteLine („Hodnota výsledné proměnné na prvním kontrolním bodě je:“ + calculator.GetResult ());
Console.Read ();
}
}
kalkulačka veřejné třídy
{
int výsledek;
veřejná kalkulačka (int i = 0)
{
výsledek = 0;
}
public void SetResult (int i = 0)
{
this.result = 0;
}
public void Přidat (int x)
{
výsledek + = x;
}
public void Odečíst (int x)
{
výsledek - = x;
}
public int GetResult ()
{
vrátit výsledek;
}
veřejné Memento CreateMemento ()
{
Memento memento = nové Memento ();
memento.SetState (výsledek);
návratové upomínky;
}
public void SetMemento (Memento memento)
{
result = memento.GetState ();
}
}
veřejná třída Memento
{
int stav;
public int GetState ()
{
návratový stav;
}
public void SetState (int state)
{
this.state = state;
}
}
Návrhový vzor Memento nám poskytuje praktický způsob ukládání a načítání stavu objektu. Tento vzor můžete využít k provedení vrácení nebo vrácení zpět. Jednou z nevýhod použití tohoto vzoru je však to, že proces ukládání stavu objektu a jeho obnovení později může trvat poměrně dlouho - tj. Může to mít negativní dopad na výkon aplikace. Když tedy používáte vzor Memento, nezapomeňte mít na paměti výkon. Nakonec se také ujistěte, že vnitřní struktura vašeho objektu není vystavena vnějšímu světu.