Comment utiliser le modèle de conception Memento en C #

Nous utilisons des modèles de conception pour résoudre les problèmes de conception courants et réduire la complexité de notre code source. Le modèle de conception Memento est un modèle de conception comportementale qui peut être utilisé pour fournir une fonction d'annulation ou de restauration dans une application, ou simplement pour réinitialiser l'état d'un objet dans une application Web ASP.Net, par exemple. En stockant l'état d'un objet dans un emplacement externe appelé Memento, ce modèle permet à cet état d'être restauré ultérieurement sur l'objet. Explorons comment nous pouvons utiliser le modèle de conception Memento en C #.

Chaque objet a son état interne. Un Memento nous donne un moyen de sauver cet état et de le restaurer tout en respectant les principes d'encapsulation, qui dictent que les membres non publics d'une instance d'une classe ne doivent pas être disponibles pour le monde extérieur. En effet, le Memento n'est disponible que pour l'objet dont il a stocké l'état.

Les participants au modèle de conception Memento comprennent un Memento, un créateur et un gardien. Alors que la classe Memento stocke l'état de l'objet, l'auteur crée le Memento et l'utilise pour restaurer l'état si nécessaire. Le gardien est uniquement responsable du stockage du Memento - il n'est pas censé modifier l'instance du Memento. 

Implémentation du modèle Memento 

Dans cette section, nous allons implémenter le modèle de conception Memento en C #. Nous allons créer un programme simple qui a trois classes - une Calculatorclasse, une Mementoclasse et le client, c'est-à-dire la Mainméthode.

Référez-vous à la Calculatorclasse donnée ci-dessous.

    calculatrice de classe publique

    {

        résultat int;

        Calculatrice publique (int i = 0)

        {

            résultat = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        public void Add (int x)

        {

            résultat + = x;

        }

        public void Subtract (int x)

        {

            résultat - = x;

        }

        public int GetResult ()

        {

            résultat de retour;

        }

        public Memento CreateMemento ()

        {

            Memento memento = nouveau Memento ();

            memento.SetState (résultat);

            retour souvenir;

        }

        public void SaveState (Memento memento)

        {

            résultat = memento.GetState ();

        }

    }

Notez les méthodes CreateMementoet SetMementodans la Calculatorclasse. Alors que le premier crée une Momentoinstance, le second récupère l'état enregistré et affecte la valeur à la variable de résultat.

La classe Memento

La Mementoclasse contient deux méthodes, SetStateet GetState. Alors que le premier est utilisé pour stocker les informations d'état, le second est utilisé pour récupérer l'état enregistré.

public class Memento

    {

        état int;

        public int GetState ()

        {

            état de retour;

        }

        public void SetState (état int)

        {

            this.state = état;

        }

    }

Le client dans cet exemple est la Mainméthode qui crée une instance de la Calculatorclasse et effectue des appels aux méthodes Addet Subtractpour effectuer le calcul. En outre, Mainenregistre les informations d'état à un point de contrôle particulier en appelant la SaveStateméthode. Plus tard, cet état enregistré est restauré et la valeur de la variable de résultat est affichée dans la fenêtre de la console. Ceci est illustré dans l'extrait de code ci-dessous.

        static void Main (string [] args)

        {

            Calculatrice calculatrice = nouvelle calculatrice ();

            calculatrice.Ajouter (5);

            calculatrice.Ajouter (10);

            calculatrice.Subtract (10);

            Memento checkPoint = calculatrice.CreateMemento ();

            calculatrice.Ajouter (100);

            Console.WriteLine («La valeur de la variable de résultat est:« + calculator.GetResult ());

            calculatrice.SaveState (point de contrôle);

            Console.WriteLine («La valeur de la variable de résultat au premier point de contrôle est:« + calculator.GetResult ());

            Console.Read ();

        }

L'exemple complet du modèle Memento

Voici le programme complet pour votre référence.

programme de classe

    {

        static void Main (string [] args)

        {

            Calculatrice calculatrice = nouvelle calculatrice ();

            calculatrice.Ajouter (5);

            calculatrice.Ajouter (10);

            calculatrice.Subtract (10);

            Memento checkPoint = calculatrice.CreateMemento ();

            calculatrice.Ajouter (100);

            Console.WriteLine («La valeur de la variable de résultat est:« + calculator.GetResult ());

            calculatrice.SaveState (point de contrôle);

            Console.WriteLine («La valeur de la variable de résultat au premier point de contrôle est:« + calculator.GetResult ());

            Console.Read ();

        }

    }

    calculatrice de classe publique

    {

        résultat int;

        Calculatrice publique (int i = 0)

        {

            résultat = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        public void Add (int x)

        {

            résultat + = x;

        }

        public void Subtract (int x)

        {

            résultat - = x;

        }

        public int GetResult ()

        {

            résultat de retour;

        }

        public Memento CreateMemento ()

        {

            Memento memento = nouveau Memento ();

            memento.SetState (résultat);

            retour souvenir;

        }

        public void SetMemento (Memento memento)

        {

            résultat = memento.GetState ();

        }

    }

    public class Memento

    {

        état int;

        public int GetState ()

        {

            état de retour;

        }

        public void SetState (état int)

        {

            this.state = état;

        }

    }

Le modèle de conception Memento nous offre un moyen pratique de stocker et de récupérer l'état d'un objet. Vous pouvez profiter de ce modèle pour effectuer une annulation ou une restauration. Cependant, l'un des inconvénients de l'utilisation de ce modèle est que le processus d'enregistrement de l'état d'un objet et de sa restauration ultérieure peut prendre un certain temps, c'est-à-dire qu'il peut être préjudiciable aux performances de l'application. Ainsi, lorsque vous utilisez le modèle Memento, assurez-vous de garder à l'esprit les performances. Enfin, assurez-vous également que la structure interne de votre objet n'est pas exposée au monde extérieur.