22 - seeren-training/Design-Pattern GitHub Wiki
Memento
- 🔖 Définition
- 🔖 Implémentation
📑 Définition
Quels problèmes le design pattern Memento peut-il résoudre ?
- L'état interne d'un objet doit être enregistré en externe afin que l'objet puisse être restauré à cet état ultérieurement.
- L'encapsulation de l'objet ne doit pas être violée.
Le problème est qu'un objet bien conçu est encapsulé de sorte que sa représentation soit cachée à l'intérieur de l'objet et ne soit pas accessible de l'extérieur de l'objet.
Quelle solution le modèle de conception Memento décrit-il ?
- Rendre un objet (initiateur) lui-même responsable d'enregistrer son état interne dans un objet (mémento) et restaurer à un état antérieur à partir d'un objet (mémento).
📑 Implémentation
Originator
public class Originator
{
private string $state;
public function setState(string $state){
$this->state = $state;
}
public function getState(): string
{
return $this->state;
}
public function saveStateToMemento(): Memento
{
return new Memento(state);
}
public function getStateFromMemento(Memento $memento)
{
$this->state = $memento->getState();
}
}
Memento
class Memento
{
private string $state;
public function __construct(string $state)
{
this.state = state;
}
public function getState(): string
{
return $this->state;
}
}
Sujet
class CareTaker
{
private $mementoList = [];
public function add(Memento state): void
{
$this->mementoList.add(state);
}
public function get(int $index): Memento
{
return $this->mementoList[$index];
}
}
Utilisation
$originator = new Originator();
$careTaker = new CareTaker();
$originator->setState("State #1");
$originator->setState("State #2");
$careTaker->add(originator.saveStateToMemento());
$originator->setState("State #3");
$careTaker->add(originator.saveStateToMemento());
$originator->setState("State #4");
$originator->getStateFromMemento($careTaker->get(0));
echo "First saved State: " . $originator->getState());
$originator->getStateFromMemento($careTaker->get(1));
echo "Second saved State: " . $originator->getState());