Maison  >  Article  >  développement back-end  >  Explication détaillée du modèle de commande en PHP et de ses méthodes d'application

Explication détaillée du modèle de commande en PHP et de ses méthodes d'application

王林
王林original
2023-06-08 17:12:59990parcourir

Le modèle de commande est un modèle de conception qui encapsule les requêtes dans un objet, vous permettant de paramétrer le client avec différentes requêtes, demandes de file d'attente ou de journalisation, et prend en charge les opérations annulables. L'idée principale de ce modèle est de séparer le comportement demandé par le client du comportement d'implémentation. Le mode commande en PHP est largement utilisé dans les systèmes qui doivent enregistrer des journaux d'application et dans les systèmes qui doivent exécuter dynamiquement des commandes historiques.

Les composants principaux du modèle de commande incluent les commandes, les récepteurs et les appelants. L'objet de commande transporte la demande d'opération et les paramètres du client. Le récepteur est l'objet qui exécute réellement ces demandes, et l'appelant envoie la demande au récepteur. L'avantage est que l'appelant n'a pas besoin de savoir par quel récepteur la demande sera exécutée, ce travail peut être facilement réalisé via l'objet de commande.

Un objet de commande doit généralement contenir les parties suivantes :

  1. La méthode execute, qui exécutera réellement l'opération de commande.
  2. execute方法,该方法会实际执行命令的操作。
  3. undo方法,当调用者需要撤销命令时,该方法会将接收者恢复到原来的状态。
  4. redo方法,当调用者需要重做命令时,该方法会将接收者恢复到最后一次执行命令的状态。

接收者实现具体的操作,例如,处理文件,执行数据库操作等。调用者负责向接收者发出请求,但是并不会直接与接收者交互。命令对象充当了调用者和接收者之间的桥梁。它将命令的具体内容与调用者和接收者分离开来,从而使得命令可以被存储,序列化,传输或重复执行。

下面我们将以具体的例子来进一步了解PHP中的命令模式。

假设我们需要实现一个简单的文本编辑器,该编辑器需要支持撤销和重做操作。首先,我们需要定义一个抽象基类Command,它将声明executeundoredoundo, lorsque l'appelant doit annuler la commande, cette méthode restaurera le destinataire à son état d'origine.

redo, lorsque l'appelant doit refaire la commande, cette méthode restaurera le récepteur à l'état de la dernière exécution de la commande.

Le récepteur implémente des opérations spécifiques, telles que le traitement de fichiers, l'exécution d'opérations de base de données, etc. L'appelant est responsable de faire des demandes au destinataire, mais n'interagit pas directement avec le destinataire. L'objet de commande agit comme un pont entre l'appelant et le destinataire. Il sépare le contenu spécifique de la commande de l'appelant et du destinataire, permettant à la commande d'être stockée, sérialisée, transmise ou exécutée à plusieurs reprises.

Ci-dessous, nous utiliserons des exemples spécifiques pour mieux comprendre le mode commande en PHP.

Supposons que nous devions implémenter un éditeur de texte simple prenant en charge les opérations d'annulation et de rétablissement. Tout d’abord, nous devons définir une classe de base abstraite Command, qui déclare trois méthodes : execute, undo et redo.

abstract class Command {
    abstract public function execute();
    abstract public function undo();
    abstract public function redo();
}

Ensuite, nous devons implémenter des commandes spécifiques, telles que l'ouverture de fichiers, l'enregistrement de fichiers et la suppression de texte.

class OpenFileCommand extends Command {
    public function __construct(FileReceiver $receiver) {
        $this->receiver = $receiver;
    }
    public function execute() {
        $this->receiver->openFile();
    }
    public function undo() {
        $this->receiver->closeFile();
    }
    public function redo() {
        $this->execute();
    }
}

class SaveFileCommand extends Command {
    public function __construct(FileReceiver $receiver) {
        $this->receiver = $receiver;
    }
    public function execute() {
        $this->receiver->saveFile();
    }
    public function undo() {
        // No need to implement
    }
    public function redo() {
        $this->execute();
    }
}

class DeleteTextCommand extends Command {
    public function __construct(TextReceiver $receiver) {
        $this->receiver = $receiver;
    }
    public function execute() {
        $this->receiver->deleteText();
    }
    public function undo() {
        $this->receiver->insertText();
    }
    public function redo() {
        $this->execute();
    }
}

Le récepteur implémente des opérations spécifiques, telles que l'ouverture de fichiers, l'enregistrement de fichiers et la suppression de texte.

class FileReceiver {
    public function openFile() {
        // Open file
    }
    public function closeFile() {
        // Close file
    }
    public function saveFile() {
        // Save file
    }
}

class TextReceiver {
    private $text = '';
    public function insertText($text) {
        $this->text .= $text;
    }
    public function deleteText() {
        $this->text = substr($this->text, 0, -1);
    }
    public function getText() {
        return $this->text;
    }
}

Enfin, nous devons implémenter l'appareil pour envoyer la demande au destinataire.

class Invoker {
    private $commands = [];
    private $current = 0;
    public function addCommand(Command $command) {
        array_splice($this->commands, $this->current);
        $this->commands[] = $command;
        $command->execute();
        $this->current++;
    }
    public function undo() {
        if ($this->current > 0) {
            $this->current--;
            $command = $this->commands[$this->current];
            $command->undo();
        }
    }
    public function redo() {
        if ($this->current < count($this->commands)) {
            $command = $this->commands[$this->current];
            $command->redo();
            $this->current++;
        }
    }
}
🎜Lors de l'utilisation d'un éditeur de texte, nous pouvons utiliser Invoker pour ajouter et annuler des commandes, ce qui conservera l'historique des commandes pour les opérations ultérieures. Par exemple : 🎜
$invoker = new Invoker();

// Open file
$invoker->addCommand(new OpenFileCommand(new FileReceiver()));

// Type 'Hello'
$textReceiver = new TextReceiver();
$textReceiver->insertText('Hello');
$invoker->addCommand(new DeleteTextCommand($textReceiver));

// Save file
$invoker->addCommand(new SaveFileCommand(new FileReceiver()));

// Undo
$invoker->undo();

// Redo
$invoker->redo();
🎜Comme le montre le code ci-dessus, nous exécutons d'abord la commande pour ouvrir le fichier, puis ajoutons une commande pour supprimer du texte, exécutons la commande et enregistrons la commande de fichier. Enfin, nous utilisons Invoker pour annuler une opération. et refaire une opération. 🎜🎜En résumé, le modèle de commande en PHP nous aide à encapsuler les requêtes et à les séparer des récepteurs et des appelants, rendant l'application plus modulaire et facilement extensible. Nous pouvons facilement ajouter de nouvelles fonctionnalités à notre application simplement en créant différents objets de commande. Qu'il s'agisse d'un éditeur de texte ou d'autres applications, le modèle de commande en PHP est un modèle de conception très utile. 🎜

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