Come usare il modello di progettazione Memento in C #

Usiamo modelli di progettazione per risolvere problemi di progettazione comuni e ridurre le complessità nel nostro codice sorgente. Il modello di progettazione Memento è un modello di progettazione comportamentale che può essere utilizzato per fornire una capacità di annullamento o rollback in un'applicazione o semplicemente per ripristinare lo stato di un oggetto in un'applicazione Web ASP.Net, ad esempio. Memorizzando lo stato di un oggetto in una posizione esterna chiamata Memento, questo modello consente di ripristinare tale stato nell'oggetto in un secondo momento. Esploriamo come possiamo usare il design pattern Memento in C #.

Ogni oggetto ha il suo stato interno. Un Memento ci offre un modo per salvare quello stato e ripristinarlo pur rispettando i principi di incapsulamento, che impongono che i membri non pubblici di un'istanza di una classe non dovrebbero essere disponibili al mondo esterno. Questo perché il Memento è disponibile solo per l'oggetto di cui ha memorizzato lo stato.

I partecipanti al design pattern Memento includono un Memento, un Originator e un Caretaker. Mentre la classe Memento memorizza lo stato dell'oggetto, l'Originator crea il Memento e lo utilizza per ripristinare lo stato quando necessario. Il Custode è responsabile solo della conservazione del Memento - non dovrebbe alterare l'istanza Memento. 

Implementazione del modello Memento 

In questa sezione implementeremo il design pattern Memento in C #. Creeremo un semplice programma che ha tre classi: una Calculatorclasse, una Mementoclasse e il client, ovvero il Mainmetodo.

Fare riferimento alla Calculatorclasse fornita di seguito.

    Calcolatrice di classi pubbliche

    {

        int risultato;

        Calcolatrice pubblica (int i = 0)

        {

            risultato = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        public void Add (int x)

        {

            risultato + = x;

        }

        public void Subtract (int x)

        {

            risultato - = x;

        }

        public int GetResult ()

        {

            risultato di ritorno;

        }

        public Memento CreateMemento ()

        {

            Memento memento = nuovo Memento ();

            memento.SetState (risultato);

            restituire il ricordo;

        }

        public void SaveState (Memento memento)

        {

            risultato = memento.GetState ();

        }

    }

Nota i metodi CreateMementoe SetMementonella Calculatorclasse. Mentre il primo crea Momentoun'istanza, il secondo recupera lo stato salvato e assegna il valore alla variabile del risultato.

La classe Memento

La Mementoclasse contiene due metodi SetStatee GetState. Mentre il primo viene utilizzato per memorizzare le informazioni sullo stato, il secondo viene utilizzato per recuperare lo stato salvato.

classe pubblica Memento

    {

        int state;

        public int GetState ()

        {

            stato di ritorno;

        }

        public void SetState (int state)

        {

            this.state = state;

        }

    }

Il client in questo esempio è il Mainmetodo che crea un'istanza della Calculatorclasse ed effettua chiamate ai metodi Adde Subtractper eseguire il calcolo. Inoltre, Mainsalva le informazioni sullo stato in un particolare checkpoint effettuando una chiamata al SaveStatemetodo. Successivamente, questo stato salvato viene ripristinato e il valore della variabile del risultato viene visualizzato nella finestra della console. Ciò è illustrato nello snippet di codice riportato di seguito.

        static void Main (string [] args)

        {

            Calcolatrice calcolatrice = nuova calcolatrice ();

            calcolatrice.Aggiungi (5);

            calcolatrice.Aggiungi (10);

            calcolatrice Sottrai (10);

            Memento checkPoint = calculator.CreateMemento ();

            calcolatrice.Aggiungi (100);

            Console.WriteLine ("Il valore della variabile del risultato è:" + calculator.GetResult ());

            calcolatore.SaveState (checkPoint);

            Console.WriteLine ("Il valore della variabile di risultato al primo checkpoint è:" + calculator.GetResult ());

            Console.Read ();

        }

L'esempio di pattern Memento completo

Ecco il programma completo come riferimento.

programma di classe

    {

        static void Main (string [] args)

        {

            Calcolatrice calcolatrice = nuova calcolatrice ();

            calcolatrice.Aggiungi (5);

            calcolatrice.Aggiungi (10);

            calcolatrice Sottrai (10);

            Memento checkPoint = calculator.CreateMemento ();

            calcolatrice.Aggiungi (100);

            Console.WriteLine ("Il valore della variabile del risultato è:" + calculator.GetResult ());

            calcolatore.SaveState (checkPoint);

            Console.WriteLine ("Il valore della variabile di risultato al primo checkpoint è:" + calculator.GetResult ());

            Console.Read ();

        }

    }

    Calcolatrice di classi pubbliche

    {

        int risultato;

        Calcolatrice pubblica (int i = 0)

        {

            risultato = 0;

        }

        public void SetResult (int i = 0)

        {

            this.result = 0;

        }

        public void Add (int x)

        {

            risultato + = x;

        }

        public void Subtract (int x)

        {

            risultato - = x;

        }

        public int GetResult ()

        {

            risultato di ritorno;

        }

        public Memento CreateMemento ()

        {

            Memento memento = nuovo Memento ();

            memento.SetState (risultato);

            restituire il ricordo;

        }

        public void SetMemento (Memento memento)

        {

            risultato = memento.GetState ();

        }

    }

    classe pubblica Memento

    {

        int state;

        public int GetState ()

        {

            stato di ritorno;

        }

        public void SetState (int state)

        {

            this.state = state;

        }

    }

Il motivo di design Memento ci offre un modo pratico per memorizzare e recuperare lo stato di un oggetto. È possibile sfruttare questo modello per eseguire un annullamento o un rollback. Tuttavia, uno degli svantaggi dell'utilizzo di questo modello è che il processo di salvataggio dello stato di un oggetto e di ripristino in seguito può richiedere un po 'di tempo, ovvero potrebbe essere dannoso per le prestazioni dell'applicazione. Quindi, quando usi il pattern Memento, assicurati di tenere a mente le prestazioni. Infine, assicurati anche che la struttura interna del tuo oggetto non sia esposta al mondo esterno.