Design Patterns Le modèle de commande

Après avoir couvert quelques modèles de conception créatifs et structurels, nous avons maintenant commencé les modèles de comportement. Vous pouvez voir le premier article dans cette catégorie du modèle de stratégie. Avec les modèles de création, nous avons appris comment créer nos objets, et des modèles de structure, nous avons appris comment structurer nos classes et nos objets pour créer une meilleure application..

Dans cet article, nous allons passer en revue le modèle de conception de commande. Comme son nom l’indique, dans ce modèle, nous exécuterons diverses commandes. Permettez-moi de prendre un mot à propos de ce modèle de Wikipedia:

Le modèle de commande est un modèle de conception comportementale dans lequel un objet est utilisé pour représenter et encapsuler toutes les informations nécessaires pour appeler une méthode ultérieurement. Ces informations incluent le nom de la méthode, l'objet propriétaire de la méthode et les valeurs des paramètres de la méthode..

Fondamentalement, un motif a de nombreux éléments impliqués, qui sont comme ci-dessous. Dans la section suivante, nous allons explorer chaque élément avec un exemple de code. Je prendrai l'exemple des actions radio - des actions très basiques allumeraient ou éteindraient la radio. Alors plongons dans chaque élément.

Receveur

Cet élément contient l'implémentation réelle (sait comment exécuter la commande demandée) de toutes les commandes. Cela conserve également l'historique des commandes exécutées, mais cela ne fait pas partie du modèle de commande réel. Nous verrons cette partie dans le modèle de conception de mémento.

// Classe du récepteur radioControl public function turnOn () // Mise en marche de la radio echo "Mise en marche de la radio";  public function turnOff () // Désactivation de la radio echo "Désactivation de la radio"; 

Commander

Cet élément contient des informations sur les mesures à prendre. Il appelle la méthode requise de receveur.

// Interface de commande radioCommand public function execute ();  La classe turnOnRadio implémente radioCommand private $ radioControl; fonction publique __construct (radioControl $ radioControl) $ this-> radioControl = $ radioControl;  fonction publique execute () $ this-> radioControl-> turnOn ();  La classe turnOffRadio implémente radioCommand private $ radioControl; fonction publique __construct (radioControl $ radioControl) $ this-> radioControl = $ radioControl;  fonction publique execute () $ this-> radioControl-> turnOff (); 

Client

Cet élément se comporte vraiment comme un client (décider quoi faire). Son travail consiste à déterminer quelle commande à exécuter, sans savoir qui l'exécutera ni comment elle sera exécutée. Dans cet exemple, j'ai pris la commande comme valeur codée en dur, mais elle peut être récupérée n'importe où, comme une valeur provenant d'une URL et / ou d'une variable post.

// Client $ in = 'turnOffRadio';

Invocateur

Cet élément initie l'ensemble du processus. Il prend des arguments du client et appelle le processus pour appeler la commande requise.

// Invocateur si (class_exists ($ in)) $ command = new $ in (new radioControl ());  else lance une nouvelle exception ('… Commande introuvable…');  $ command-> execute ();

Une fois cette commande exécutée, "Turning Off Radio" apparaîtra comme sortie, car le client a appelé cette commande. Des commandes supplémentaires peuvent être exécutées de la même manière. Si notre action était définie comme éteindre la radio, alors il devrait montrer "Allumer la radio". Assez simple, n'est-ce pas?

Mettre tous ensemble

Terminons tous les éléments ici pour voir comment cela fonctionne.

// Classe du récepteur radioControl public function turnOn () // Mise en marche de la radio echo "Mise en marche de la radio";  public function turnOff () // Désactivation de la radio echo "Désactivation de la radio";  // Interface de commande radioCommand public function execute ();  La classe turnOnRadio implémente radioCommand private $ radioControl; fonction publique __construct (radioControl $ radioControl) $ this-> radioControl = $ radioControl;  fonction publique execute () $ this-> radioControl-> turnOn ();  La classe turnOffRadio implémente radioCommand private $ radioControl; fonction publique __construct (radioControl $ radioControl) $ this-> radioControl = $ radioControl;  fonction publique execute () $ this-> radioControl-> turnOff ();  // Client $ in = 'turnOffRadio'; // Invocateur si (class_exists ($ in)) $ command = new $ in (new radioControl ());  else lance une nouvelle exception ('… Commande introuvable…');  $ command-> execute ();

Ajout de nouvelles commandes

Auparavant, nous n'avions qu'une fréquence à jouer à la radio, nous n'avions donc que deux méthodes, à savoir activer ou désactiver la radio. Mais imaginons qu'avec le temps, nous avons plusieurs fréquences à jouer, ce qui nous oblige à ajouter deux nouvelles méthodes: mise au point et tuneDown. Voyons comment nous pouvons ajouter ces.

Lorsque nous utilisons des modèles de conception, cela nous permet d'apporter des modifications ou d'étendre les fonctionnalités sans apporter de modification au code client. Ceci s'applique ici aussi. Nous allons ajouter deux autres commandes, mais notre code client et invocateur restera tel quel..

L'ajout de nouvelles commandes nécessite des modifications à deux endroits. La première consiste à créer de nouvelles commandes qui implémentent notre radio commande interface, et ensuite est de définir la mise en œuvre réelle de ces commandes dans le récepteur.

Nouvelles commandes

class tuneUpRadio implémente radioCommand private $ radioControl; fonction publique __construct (radioControl $ radioControl) $ this-> radioControl = $ radioControl;  fonction publique execute () $ this-> radioControl-> tuneUp ();  class tuneDownRadio implémente radioCommand private $ radioControl; fonction publique __construct (radioControl $ radioControl) $ this-> radioControl = $ radioControl;  fonction publique execute () $ this-> radioControl-> tuneDown (); 

Code de destinataire mis à jour

Nous allons ajouter deux nouvelles méthodes dans notre classe de récepteur.

// Classe du récepteur radioControl public function turnOn () // Mise en marche de la radio echo "Mise en marche de la radio";  public function turnOff () // Désactivation de la radio echo "Désactivation de la radio";  public function tuneUp () // Réglage de la radio echo "Réglage de la radio";  public function tuneDown () // Atténuer la radio écho "Atténuer la radio"; 

Conclusion

Nous devrions donc utiliser le modèle de conception Command lorsque nous avons plusieurs commandes à exécuter, et peu importe si ces commandes sont liées les unes aux autres ou non. J'ai essayé de mon mieux pour élaborer sur ce modèle de conception, et vous pouvez poster vos commentaires dans la section commentaire.