Verwendung des Memento-Entwurfsmusters in C #

Wir verwenden Entwurfsmuster, um häufig auftretende Entwurfsprobleme zu lösen und die Komplexität unseres Quellcodes zu verringern. Das Memento-Entwurfsmuster ist ein Verhaltensentwurfsmuster, das verwendet werden kann, um eine Rückgängig- oder Rollback-Funktion in einer Anwendung bereitzustellen oder beispielsweise einfach den Status eines Objekts in einer ASP.Net-Webanwendung zurückzusetzen. Durch Speichern des Status eines Objekts an einem externen Speicherort, der als Memento bezeichnet wird, kann dieser Status zu einem späteren Zeitpunkt im Objekt wiederhergestellt werden. Lassen Sie uns untersuchen, wie wir das Memento-Entwurfsmuster in C # verwenden können.

Jedes Objekt hat seinen internen Zustand. Ein Memento gibt uns die Möglichkeit, diesen Zustand zu retten und wiederherzustellen, während wir uns weiterhin an die Prinzipien der Kapselung halten, die vorschreiben, dass nicht öffentliche Mitglieder einer Instanz einer Klasse der Außenwelt nicht zur Verfügung stehen dürfen. Dies liegt daran, dass das Memento nur für das Objekt verfügbar ist, dessen Status es gespeichert hat.

Zu den Teilnehmern am Memento-Entwurfsmuster gehören ein Memento, ein Originator und ein Hausmeister. Während die Memento-Klasse den Status des Objekts speichert, erstellt der Originator das Memento und verwendet es, um den Status bei Bedarf wiederherzustellen. Der Hausmeister ist nur für die Speicherung des Memento verantwortlich - er soll die Memento-Instanz nicht ändern. 

Implementierung des Memento-Musters 

In diesem Abschnitt implementieren wir das Memento-Entwurfsmuster in C #. Wir werden ein einfaches Programm erstellen, das drei Klassen hat - eine CalculatorKlasse, eine MementoKlasse und den Client, dh die MainMethode.

Beziehen Sie sich auf die Calculatorunten angegebene Klasse.

    öffentlicher Klassenrechner

    {

        int Ergebnis;

        öffentlicher Rechner (int i = 0)

        {

            Ergebnis = 0;

        }}

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }}

        public void Add (int x)

        {

            Ergebnis + = x;

        }}

        public void Subtrahieren (int x)

        {

            Ergebnis - = x;

        }}

        public int GetResult ()

        {

            Ergebnis zurückgeben;

        }}

        öffentliches Memento CreateMemento ()

        {

            Memento memento = neues Memento ();

            memento.SetState (Ergebnis);

            Erinnerungsstück zurückgeben;

        }}

        public void SaveState (Memento memento)

        {

            Ergebnis = memento.GetState ();

        }}

    }}

Beachten Sie die Methoden CreateMementound SetMementoin der CalculatorKlasse. Während Ersteres eine MomentoInstanz erstellt, ruft Letzteres den gespeicherten Status ab und weist den Wert der Ergebnisvariablen zurück.

Die Memento-Klasse

Die MementoKlasse enthält zwei Methoden SetStateund GetState. Während ersteres zum Speichern der Statusinformationen verwendet wird, wird letzteres zum Abrufen des gespeicherten Status verwendet.

öffentliche Klasse Memento

    {

        int state;

        public int GetState ()

        {

            Rückgabestatus;

        }}

        public void SetState (int state)

        {

            this.state = state;

        }}

    }}

Der Client ist in diesem Beispiel die MainMethode , die eine Instanz der schafft CalculatorKlasse und macht Anrufe an den Addund SubtractMethoden Berechnung durchzuführen. Darüber hinaus Mainspeichert die Zustandsinformationen zu einem bestimmten Kontrollpunkt durch einen Aufruf an die Herstellung SaveStateMethode. Später wird dieser gespeicherte Status wiederhergestellt und der Wert der Ergebnisvariablen im Konsolenfenster angezeigt. Dies ist in dem unten angegebenen Code-Snippet dargestellt.

        statische Leere Main (string [] args)

        {

            Rechner Rechner = neuer Rechner ();

            Rechner.Add (5);

            Rechner.Add (10);

            Taschenrechner. Subtrahieren (10);

            Memento checkPoint = calculator.CreateMemento ();

            Rechner.Add (100);

            Console.WriteLine („Der Wert der Ergebnisvariablen ist:“ + calculator.GetResult ());

            calculator.SaveState (checkPoint);

            Console.WriteLine („Der Wert der Ergebnisvariablen am ersten Prüfpunkt lautet:“ + calculator.GetResult ());

            Console.Read ();

        }}

Das vollständige Beispiel für ein Memento-Muster

Hier ist das komplette Programm als Referenz.

Klassenprogramm

    {

        statische Leere Main (string [] args)

        {

            Rechner Rechner = neuer Rechner ();

            Rechner.Add (5);

            Rechner.Add (10);

            Taschenrechner. Subtrahieren (10);

            Memento checkPoint = calculator.CreateMemento ();

            Rechner.Add (100);

            Console.WriteLine („Der Wert der Ergebnisvariablen ist:“ + calculator.GetResult ());

            calculator.SaveState (checkPoint);

            Console.WriteLine („Der Wert der Ergebnisvariablen am ersten Prüfpunkt lautet:“ + calculator.GetResult ());

            Console.Read ();

        }}

    }}

    öffentlicher Klassenrechner

    {

        int Ergebnis;

        öffentlicher Rechner (int i = 0)

        {

            Ergebnis = 0;

        }}

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }}

        public void Add (int x)

        {

            Ergebnis + = x;

        }}

        public void Subtrahieren (int x)

        {

            Ergebnis - = x;

        }}

        public int GetResult ()

        {

            Ergebnis zurückgeben;

        }}

        öffentliches Memento CreateMemento ()

        {

            Memento memento = neues Memento ();

            memento.SetState (Ergebnis);

            Erinnerungsstück zurückgeben;

        }}

        public void SetMemento (Memento memento)

        {

            Ergebnis = memento.GetState ();

        }}

    }}

    öffentliche Klasse Memento

    {

        int state;

        public int GetState ()

        {

            Rückgabestatus;

        }}

        public void SetState (int state)

        {

            this.state = state;

        }}

    }}

Das Memento-Entwurfsmuster bietet uns eine praktische Möglichkeit, den Status eines Objekts zu speichern und abzurufen. Sie können dieses Muster nutzen, um ein Rückgängigmachen oder ein Rollback durchzuführen. Einer der Nachteile der Verwendung dieses Musters besteht jedoch darin, dass das Speichern und spätere Wiederherstellen des Status eines Objekts einige Zeit in Anspruch nehmen kann, dh die Leistung der Anwendung beeinträchtigen kann. Denken Sie also bei der Verwendung des Memento-Musters unbedingt an die Leistung. Stellen Sie schließlich auch sicher, dass die interne Struktur Ihres Objekts nicht der Außenwelt ausgesetzt ist.