Maison  >  Article  >  développement back-end  >  Explication détaillée du modèle de mémo du modèle de conception PHP

Explication détaillée du modèle de mémo du modèle de conception PHP

*文
*文original
2018-01-05 17:52:021682parcourir

Cet article présente principalement le mode mémo en mode conception PHP et utilise PHP pour implémenter le mode mémo. Les amis intéressés peuvent s'y référer. J'espère que cela aide tout le monde.

1. Intention
Capturer l'état interne d'un objet et enregistrer cet état à l'extérieur de l'objet sans détruire l'encapsulation. Cela vous permet de restaurer ultérieurement l'état de l'objet à son état précédemment enregistré.

2. Schéma de structure du mode Mémo

3. Rôles principaux
1. Rôle Memento :
stocke l'état interne de l'objet d'origine, et l'auteur change en fonction des besoins Détermine quel interne état de l'initiateur que le mémo stocke.
Le mémo peut protéger son contenu contre toute lecture par tout objet autre que l'objet d'origine.
2. Rôle d'auteur :
Créer un objet mémo contenant l'état interne actuel
Utiliser l'objet mémo pour stocker son état interne
3. Rôle de gardien :
Responsable de la sauvegarde de l'objet mémo et de ne pas vérifier le contenu de l'objet mémo
4. Avantages du mode mémo et inconvénients
Avantages du mode mémo :
1. Parfois, certaines informations internes de l'objet initiateur doivent être enregistrées en dehors de l'objet initiateur, mais elles doivent être enregistrées par les objets humains initiateurs. lisez-le eux-mêmes.
2. Simplification de la classe Originator. L'Auteur n'a plus besoin de gérer et de sauvegarder les versions de ses états internes. Les Clients peuvent gérer eux-mêmes les versions de ces états dont ils ont besoin
3. Lorsque le statut du rôle Originateur change, il est possible que ce soit le cas. invalide, vous pouvez utiliser le mémo temporairement stocké pour restaurer le statut.
Inconvénients du mode mémo :
1. Si le statut du rôle initiateur doit être entièrement stocké dans l'objet mémo, l'objet mémo sera très coûteux en termes de consommation de ressources.
2. Lorsque le responsable stocke un mémo, le responsable peut ne pas savoir combien d'espace de stockage ce statut occupera, et ne peut donc pas rappeler à l'utilisateur si une opération coûtera cher.
3. Lorsque le statut du rôle d'initiateur change, le statut peut être invalide.
5. Scénarios applicables du mode mémo
1. L'état (partiel) d'un objet à un moment donné doit être enregistré afin qu'il puisse être restauré à l'état actuel. état précédent lorsque cela est nécessaire dans l’état futur.
2. Si une interface est utilisée pour permettre à d'autres objets d'obtenir directement ces états, les détails d'implémentation de l'objet seront exposés et l'encapsulation de l'objet sera détruite.
6. Mode mémo et autres modes
1. Mode commande (command mode) : Le mode commande peut également être utilisé pour restaurer l'état d'un objet. Généralement, Le mode commande peut prendre en charge la restauration d'état à plusieurs niveaux, Memento n'est qu'une simple récupération (instantané). À chaque annulation du mode Commande, Memento peut être utilisé pour enregistrer l'état de l'objet.
2. Mode Itérateur (Iterator mode) : Le mémo peut être utilisé pour l'itération
7. Exemple PHP du mode Mémo

<?php
/**
 * 发起人(Originator)角色
 */
class Originator {
 
  private $_state;
 
  public function __construct() {
    $this->_state = &#39;&#39;;
  }
 
  /**
   * 创建备忘录
   * @return Memento 包含当前状态的备忘录对象
   */
  public function createMemento() {
    return new Memento($this->_state);
  }
 
  /**
   * 将发起人恢复到备忘录对象记录的状态上
   * @param Memento $memento
   */
  public function restoreMemento(Memento $memento) {
    $this->_state = $memento->getState();
  }
 
  public function setState($state) {
    $this->_state = $state;
  }
 
  public function getState() {
    return $this->_state;
  }
 
  /**
   * 测试用方法,显示状态
   */
  public function showState() {
    echo "Original Status:", $this->getState(), "<br />";
  }
 
}
 
/**
 * 备忘录(Memento)角色
 */
class Memento {
 
  private $_state;
 
  public function __construct($state) {
    $this->setState($state);
  }
 
  public function getState() {
    return $this->_state;
  }
 
  public function setState($state) {
    $this->_state = $state;
  }
 
}
 
/**
 * 负责人(Caretaker)角色
 */
class Caretaker {
 
  private $_memento;
 
  public function getMemento() {
    return $this->_memento;
  }
 
  public function setMemento(Memento $memento) {
    $this->_memento = $memento;
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
 
    /* 创建目标对象 */
    $org = new Originator();
    $org->setState(&#39;open&#39;);
    $org->showState();
 
    /* 创建备忘 */
    $memento = $org->createMemento();
 
    /* 通过Caretaker保存此备忘 */
    $caretaker = new Caretaker();
    $caretaker->setMemento($memento);
 
    /* 改变目标对象的状态 */
    $org->setState(&#39;close&#39;);
    $org->showState();
 
    /* 还原操作 */
    $org->restoreMemento($caretaker->getMemento());
    $org->showState();
  }
 
}
 
Client::main();
?>

Recommandations associées :

Explication détaillée du mode pont du modèle de conception PHP

PHP modèle de conception Explication détaillée du modèle de proxy

Explication détaillée du modèle de stratégie du modèle de conception PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn