Points de base
Aujourd'hui, plus de 4 milliards de téléphones portables sont utilisés dans le monde entier. Rien qu'en Australie, la population est d'environ 11 millions, tandis que le nombre de téléphones portables dépasse 22 millions - en moyenne 2 téléphones portables par personne! Il est évident que l'utilisation des téléphones portables devient de plus en plus courante. Compte tenu de la popularité des smartphones et d'autres appareils mobiles, de plus en plus de clients choisissent maintenant de recevoir des notifications via des SMS plutôt que des e-mails. SMS a un avantage sur les e-mails - ils sont courts, instantanés et surtout, le spam est négligeable. Alors, qu'est-ce que cela a à voir avec le mode de commande? Regardons une scène fictive. Une entreprise a un site Web qui organise un concours primé chaque jour. Il dispose d'une base de données de plus de 250 000 utilisateurs enregistrés, chaque utilisateur reçoit un mot de passe chaque jour, qu'il doit entrer ou cliquer sur le lien pour s'inscrire à la loterie. La plupart des utilisateurs choisissent de recevoir des e-mails, mais maintenant un nombre considérable d'utilisateurs choisissent de recevoir des notifications via des messages texte. Voici la question: comment envoyer des messages à deux groupes d'utilisateurs via deux canaux différents? L'approche logique consiste à diviser l'utilisateur en deux groupes, aux destinataires par e-mail et aux destinataires SMS, ce qui impliquera d'exécuter deux requêtes différentes et d'envoyer le mot de passe à chaque groupe séparément. En utilisant le modèle de commande qui sera décrit dans cet article, vous pouvez envoyer des messages à deux groupes d'utilisateurs via un seul processus.
File d'attente de message à l'aide du mode de commande
Le mode de commande(parfois appelé mode d'action ou mode de transaction) est un modèle de conception qui décrit comment les demandes sont encapsulées en tant qu'objets afin que vous puissiez faire la queue ou enregistrer des clients avec différentes demandes. Pour montrer comment fonctionne le mode de commande, utilisons un exemple simple des files d'attente de messages. Ce qui suit est la définition de la classe MessageQueue:
<?php class MessageQueue { private $queue; public function __construct() { $this->queue = array(); } public function addMessage(IMessage $msg) { $this->queue[] = $msg; } public function execute() { $sendCount = 0; foreach ($this->queue as $msg) { if ($msg->send()) { $sendCount++; } } return $sendCount; } }
La file d'attente de messages fournit deux méthodes: la méthode AddMessage (), qui ajoute des objets de message à la file d'attente; et la méthode EXECUTE (), qui gère chaque message dans la file d'attente. Dans cet exemple, la méthode AddMessage () ajoute simplement le message à la file d'attente de baisses internes, tandis que la méthode Execute () itère sur les éléments de la file d'attente $ et appelle la méthode Send () pour chaque objet de message. Mode de commande File d'attente de chaque demande de traitement ultérieur; MessageQueue n'a pas besoin de savoir comment gérer la demande, car ce sera la responsabilité de l'objet de demande. Pour s'assurer que la méthode Send () est disponible, l'objet Message doit implémenter l'interface iMessage.
<?php interface IMessage { public function send(); }
Chaque objet de message implémente l'interface iMessage et fournit sa propre implémentation de la méthode Send ().
<?php class DailyAlertEmail implements IMessage { // ... public function send() { // 发送电子邮件的实际代码 // ... echo "Sending message via email\n"; } } class DailyAlertSMS implements IMessage { // ... public function send() { // 发送短信的实际代码 // ... echo "Sending message via SMS\n"; } }
Message DailyleTerMail implémente sa méthode Send () pour envoyer un mot de passe en e-mail, tandis que l'objet Message DailALelerTSMS implémente sa méthode Send () pour envoyer un message sous forme de message SMS. Ensuite, pour envoyer un message aux destinataires SMS et par e-mail, vous interrogerez la base de données pour obtenir ses préférences de communication, instanciez l'objet iMessage approprié et ajoutez-le à la file d'attente de messages, puis appelez la méthode Execute () de la file d'attente. Soit dit en passant, la création de l'objet iMessage correct pour les utilisateurs sera une bonne occasion d'utiliser le modèle de conception de la méthode d'usine!
<?php // 创建一个新的队列 $msgQueue = new MessageQueue(); $result = $db->query("SELECT * FROM customers"); while ($customer = $result->fetch(PDO::FETCH_ASSOC)) { // 工厂根据用户的偏好创建DailyAlertSMS或DailyAlertEmail对象 $msg = MessageFactory::build($customer, $codeword); // 将消息对象添加到队列中 $msgQueue->addMessage($msg); } // 现在发送给所有客户 $msgQueue->execute();
En utilisant le mode de commande, vous pouvez récupérer tous les clients de la base de données, quelles que soient les préférences de communication du client, instancier les implémentations d'iMessage appropriées et les traiter immédiatement, au lieu de remettre en question d'abord toutes les bases de données des clients de SMS et de les traiter, puis de répéter ce processus pour les clients de messagerie. N'oubliez pas que ce soit un exemple de base; Avec quelques modifications mineures, vous pouvez la convertir en une file d'attente de messages "retardée" qui s'exécute comme une tâche CRON et utiliser une base de données pour surveiller la progression du processus.
Résumé
Comme vous pouvez le voir, le mode de commande est parfait pour les situations suivantes:
Dans ce didacticiel, je vous montre comment le modèle de commande devient un modèle de conception utile pour implémenter les files d'attente de commandes, où les demandes peuvent être mise en file d'attente pour un traitement séquentiel, tout en découplant l'implémentation réelle de l'exécution à partir de la file d'attente elle-même. horiyan / shutterstock
Modèle de conception de commande FAQ (FAQ)
Le modèle de conception de commande est principalement utilisé pour découpler l'expéditeur et le récepteur des demandes. Cela signifie que l'expéditeur n'a pas besoin de connaître les détails de l'action effectuée ou du destinataire de la demande. Au lieu de cela, l'expéditeur sait comment émettre une commande et la commande sait comment exécuter une demande. Ce mode est particulièrement utile dans les scénarios où vous souhaitez utiliser des objets paramétrés de l'opération et devez faire la queue, spécifier et exécuter des demandes à différents moments.
Le modèle de conception de commande fonctionne en encapsulant les demandes dans des objets, permettant aux utilisateurs d'utiliser des files d'attente, des demandes et des opérations pour paramétrer les clients. Il s'agit de quatre composants: commande, récepteur, appelant et client. La commande déclare l'interface pour effectuer l'opération, le récepteur sait comment effectuer l'opération, l'appelant enregistre la commande et demande à un moment donné à la commande d'exécuter la demande en appelant sa méthode d'exécution, tandis que le client crée un objet ConcreteCommand et définit son récepteur.
Les modèles de conception de commandes offrent de nombreux avantages. Il découple les classes qui appellent les opérations et les objets qui savent effectuer des opérations, il vous permet de créer une série de commandes en fournissant un système de file d'attente et vous permet de contrôler l'exécution de ces commandes. De plus, il prend en charge les opérations annulantes, car chaque commande est un objet avec une méthode spécifique.
Le modèle de conception de commande est particulièrement utile lorsque vous devez faire une demande à un objet sans connaître l'action demandée ou le destinataire de la demande. Il est également bénéfique lorsque vous devez utiliser des objets paramétrés de l'opération et avoir besoin de filer, de spécifier et d'exécuter des demandes à différents moments.
Bien sûr, un exemple commun de modèles de conception de commandes consiste à implémenter un système de menu dans une interface utilisateur graphique (GUI). Chaque action du menu peut être une commande. Lorsque l'utilisateur clique sur un élément de menu, la commande associée à l'élément est exécutée.
Bien que les deux modes encapsulent les algorithmes dans un composant séparé, leur objectif est différent. Le mode de commande consiste à séparer la responsabilité de publier une commande de la responsabilité de l'exécution d'une commande, ce qui facilite l'ajout de commandes ou modifie l'exécution d'une commande. D'un autre côté, le modèle de politique consiste à définir une série d'algorithmes, à résumer chaque algorithme et à les rendre interchangeables.
Oui, le modèle de conception de commande peut prendre en charge les opérations annulantes. Pour ce faire, la classe de commande doit maintenir un état qui inverse son effet et met en œuvre une méthode d'annulation qui restaure l'objet à son état précédent.
Oui, les modèles de conception de commandes sont très utiles dans la programmation multithread. Il vous permet d'encapsuler les demandes dans des objets qui peuvent ensuite être exécutés dans des threads séparés. Cela peut simplifier considérablement la synchronisation du thread.
Le modèle de conception de commande est un bon exemple de l'encapsulation - l'un des principes de base de la conception orientée objet. Il résume les demandes dans des objets, vous permettant de paramétrer les clients avec différentes demandes.
Bien que le modèle de conception des commandes présente de nombreux avantages, il n'est pas sans défauts. Le principal inconvénient est qu'il provoque une augmentation du nombre de classes, car chaque commande est représentée par une classe distincte. Cela peut rendre le système plus complexe et difficile à comprendre.
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!