Chi è il proprietario delle informazioni? Memento vs. Originator

4

Immagina per un secondo che sto implementando il Memento Pattern, usando le seguenti classi.

Corsi

  • Una classe Originator che ha rispettivamente proprietà pubbliche e private, campi e
  • Una classe Memento che ha molte proprietà / campi che rappresentano lo stato del creatore
  • Una classe CareTaker che agisce su un'istanza di Originator e salva un elenco di Mementos che rappresentano lo stato di Originator.

Utilizzando le classi di esempio sopra, esiste una ragione obiettiva per utilizzare una delle seguenti soluzioni rispetto all'altra? La premessa qui è che ho bisogno di esporre alcune proprietà che rappresentano parzialmente lo stato di Originator.

Soluzione n. 1

  • Proprietà e campi che rappresentano lo stato sono duplicati su Originator & Memento
  • Originator ha un metodo CreateMemento che inizializza un nuovo Memento con tutte le proprietà / campi condivisi tra i due
  • Originator ha un metodo SetMemento che imposta i campi / proprietà di Originator su quelli che corrispondono a
  • di Memento

Soluzione n. 2

  • Originator ha un'istanza di Memento, che rappresenta lo stato corrente di Originator
  • Originator espone come proprietà, le proprietà necessarie / campi del suo Memento, usando i getter / setter per aggiornare il promemore
  • Originator non ha la propria copia di proprietà / campi che rappresentano il suo stato, invece utilizza Memento come backing store.

Capisco che idealmente dovrebbe esserci un'altra classe OriginatorState, quella Originator & Memento hanno entrambi istanze di, ma non sto chiedendo su quali classi creare. Sto chiedendo quale classe detiene l'informazione dello stato attuale dell'originatore. Sia l'Originatore che il Memento? Solo il Memento? o l'Originatore attraverso il Memento come nella Soluzione n. 2?

    
posta D-Jones 04.09.2015 - 16:30
fonte

2 risposte

1

Una volta che l'Originatore genera un Memento, il Caretaker non dovrebbe avere un'API disponibile per modificare i dati contenuti all'interno di quell'oggetto. La chiave è che l'incapsulamento non viene perso quando si consegna il Memento al Caretaker.

Oggettivamente, se l'unica vera differenza tra l'Opzione 1 e l'Opzione 2 è che l'Originatore usa internamente un'istanza del Memento per mantenere il suo stato, non importa. Non è obbligatorio, ma non è proibito.

    
risposta data 14.09.2015 - 19:49
fonte
-1

Dalla descrizione di Memento Design Pattern :

The Memento design pattern defines three distinct roles:

  1. Originator - the object that knows how to save itself.

  2. Caretaker - the object that knows why and when the Originator needs to save and restore itself.

  3. Memento - the lock box that is written and read by the Originator, and shepherded by the Caretaker.

L'Originatore è responsabile della creazione del Memento e del ripristino di uno stato precedente. Un Memento è solo una borsa di dati priva di logica. Il CareTaker sa quando ottenere un Memento e quando l'Originatore deve essere ripristinato da un Memento.

    
risposta data 04.09.2015 - 20:27
fonte