Maison >développement back-end >tutoriel php >Comprendre le modèle de conception de commande

Comprendre le modèle de conception de commande

Christopher Nolan
Christopher Nolanoriginal
2025-03-01 09:02:10334parcourir

Understanding the Command Design Pattern

Points de base

  • Le mode de commande (également connu sous le nom de mode d'action ou de mode de transaction) encapsule les demandes dans des objets, permettant aux clients avec différentes demandes de faire la queue ou d'enregistrer. Il est très 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.
  • Dans les scénarios où les messages doivent être envoyés à différents groupes d'utilisateurs via différents canaux (e-mail et messages texte), le mode de commande fournit une approche unifiée. Il permet à tous les clients d'être récupérés de la base de données, quelles que soient les préférences de communication du client, pour instancier les implémentations d'iMessage appropriées et les traiter immédiatement, plutôt que de répéter ce processus pour chaque groupe.
  • Le mode de commande
  • est idéal pour les situations où vous souhaitez paramètre l'objet par l'action que vous souhaitez effectuer;

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:

  • Vous souhaitez pouvoir paramétrer l'objet par l'action que vous souhaitez effectuer.
  • Vous devez spécifier, faire filer et exécuter des demandes à différents moments.
  • Lorsqu'il est nécessaire de résumer un ensemble de transformations de données en une seule opération (comme une transaction).

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)

Quel est le but principal du modèle de conception de commande?

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.

Comment fonctionne le modèle de conception de commande?

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.

Quels sont les avantages de l'utilisation de modèles de conception de commandes?

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.

Quand dois-je utiliser le modèle de conception de commande?

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.

Pouvez-vous fournir un exemple du modèle de conception de commande utilisé?

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.

Quelle est la différence entre les modèles de conception de commande et de politique?

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.

Le modèle de conception des commandes peut-il être utilisé pour l'annulation des opérations?

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.

Le modèle de conception de commande est-il adapté à la programmation multithreading?

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.

Quelle est la relation entre les modèles de conception de commande et les principes de conception orientés objet?

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.

Quels sont les inconvénients de l'utilisation de modèles de conception de commande?

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!

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