Heim > Backend-Entwicklung > PHP-Tutorial > Das Befehlsdesign -Muster verstehen

Das Befehlsdesign -Muster verstehen

Christopher Nolan
Freigeben: 2025-03-01 09:02:10
Original
332 Leute haben es durchsucht

Understanding the Command Design Pattern

Kernpunkte

  • Befehlsmodus (auch als Aktionsmodus oder Transaktionsmodus bezeichnet) verkapselt Anforderungen in Objekte und ermöglicht Clients mit unterschiedlichen Anforderungen an Warteschlangen oder Aufzeichnungen. Es ist sehr nützlich für die Implementierung von Befehlswarteschlangen, bei denen Anforderungen für die sequentielle Verarbeitung in die Warteschlange gestellt werden können, während die tatsächliche Implementierung der Ausführung aus der Warteschlange selbst entkoppelt wird.
  • In Szenarien, in denen Nachrichten über verschiedene Kanäle (E -Mail- und Textnachrichten) an verschiedene Benutzergruppen gesendet werden müssen, bietet der Befehlsmodus einen einheitlichen Ansatz. Es ermöglicht es allen Kunden, unabhängig von den Kommunikationspräferenzen des Kunden aus der Datenbank abgerufen zu werden, um die entsprechenden Imessage -Implementierungen zu instanziieren und diese gleichzeitig zu verarbeiten, anstatt diesen Prozess für jede Gruppe zu wiederholen.
  • Befehlsmodus ist ideal für Situationen, in denen Sie das Objekt durch die Aktion, die Sie ausführen möchten, parametrisieren möchten.

Heute werden weltweit mehr als 4 Milliarden Mobiltelefone verwendet. Allein in Australien beträgt die Bevölkerung etwa 11 Millionen, während die Zahl der Mobiltelefone 22 Millionen übersteigt - durchschnittlich 2 Mobiltelefone pro Person! Es ist offensichtlich, dass die Nutzung von Mobiltelefonen immer häufiger wird. Angesichts der Beliebtheit von Smartphones und anderen mobilen Geräten entscheiden sich immer mehr Kunden, Benachrichtigungen über Textnachrichten und E -Mails zu erhalten. SMS hat einen Vorteil gegenüber E -Mails - sie sind kurz, sofort und vor allem ist Spam vernachlässigbar. Was hat das mit dem Befehlsmodus zu tun? Schauen wir uns eine fiktive Szene an. Ein Unternehmen hat eine Website, die jeden Tag einen preisgekrönten Wettbewerb veranstaltet. Es verfügt über eine Datenbank von über 250.000 registrierten Benutzern. Jeder Benutzer erhält jeden Tag ein Passwort, das er eingeben oder auf den Link klicken muss, um sich für die Lotterie zu registrieren. Die meisten Benutzer erhalten E -Mails, aber jetzt erhalten eine beträchtliche Anzahl von Benutzern Benachrichtigungen über Textnachrichten. Hier ist die Frage: Wie senden Sie Nachrichten über zwei verschiedene Kanäle an zwei Benutzergruppen? Der logische Ansatz besteht darin, den Benutzer in zwei Gruppen, E -Mail -Empfänger und SMS -Empfänger aufzuteilen, bei denen zwei verschiedene Abfragen ausgeführt und das Passwort separat an jede Gruppe gesendet werden. Mit dem in diesem Artikel beschriebenen Befehlsmuster können Sie Nachrichten über einen einzigen Prozess an zwei Gruppen von Benutzern senden.

Nachrichtenwarteschlange Verwenden des Befehlsmodus

Befehlsmodus (manchmal als Action -Modus oder Transaktionsmodus bezeichnet) ist ein Entwurfsmuster, das beschreibt, wie Anforderungen als Objekte eingekapselt werden, damit Sie Clients mit unterschiedlichen Anforderungen anwenden oder aufzeichnen können. Um zu demonstrieren, wie der Befehlsmodus funktioniert, verwenden wir ein einfaches Beispiel für Nachrichtenwarteschlangen. Das Folgende ist die Definition der MessageQueue -Klasse:

<?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;
    }
}
Nach dem Login kopieren

Nachrichtenwarteschlange bietet zwei Methoden - die addMessage () -Methode, die der Warteschlange Meldungsobjekte hinzufügt; In diesem Beispiel addiert die Methode addMessage () die Nachricht lediglich an das interne Array $ -Te -Warteschlange, während die methodische Methode execute () über die Elemente in der $ -Te -Warteschlange iteriert und die Methode Send () für jedes Nachrichtenobjekt aufruft. Befehlsmodus -Warteschlangen jede Anfrage zur späteren Verarbeitung; MessageQueue muss nicht wissen, wie die Anfrage umgehen soll, da dies in der Verantwortung des Anforderungsobjekts liegt. Um sicherzustellen, dass die Send () -Methode verfügbar ist, muss das Nachrichtenobjekt die iMessage -Schnittstelle implementieren.

<?php
interface IMessage
{
    public function send();
}
Nach dem Login kopieren

Jedes Nachrichtenobjekt implementiert die iMessage -Schnittstelle und bietet eine eigene Implementierung der Send () -Methode.

<?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";
    }
}
Nach dem Login kopieren

DailyalerTemail -Nachricht implementiert die Send () -Methode, um ein Kennwort als E -Mail zu senden, während das Dailyalertsms -Nachrichtenobjekt seine Methode send () implementiert, um eine Nachricht als SMS -Nachricht zu senden. Um dann eine Nachricht an die SMS und E -Mail -Empfänger zu senden, werden Sie die Datenbank abfragen, um ihre Kommunikationseinstellungen zu erhalten, das entsprechende iMessage -Objekt zu instanziieren und der Meldungswarteschlange hinzuzufügen, und rufen dann die ausführende () -Methode der Warteschlange auf. Das Erstellen des richtigen iMessage -Objekts für Benutzer ist übrigens eine gute Gelegenheit, das Entwurfsmuster der Werksmethode zu verwenden!

<?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();
Nach dem Login kopieren

Verwenden des Befehlsmodus können Sie alle Kunden aus der Datenbank abrufen, unabhängig von den Kommunikationseinstellungen des Kunden, die entsprechenden IMessage -Implementierungen instanziieren und gleichzeitig verarbeiten, anstatt zuerst alle SMS -Kundendatenbanken abzufragen und diese zu verarbeiten und dann diesen Prozess für E -Mail -Kunden zu wiederholen. Denken Sie daran, dies ist nur ein grundlegendes Beispiel. Mit einigen geringfügigen Änderungen können Sie es in eine "verzögerte" Nachrichtenwarteschlange umwandeln, die als Cron -Aufgabe ausgeführt wird und eine Datenbank verwenden, um den Fortschritt des Prozesses zu überwachen.

Zusammenfassung

Wie Sie sehen, ist der Befehlsmodus perfekt für die folgenden Situationen:

  • Sie möchten das Objekt durch die Aktion, die Sie ausführen möchten, parametrisieren können.
  • Sie müssen Anfragen zu unterschiedlichen Zeiten angeben, anstellen und ausführen.
  • Wenn es notwendig ist, eine Reihe von Datenänderungen in einen einzelnen Vorgang zu verkapulieren (z. B. eine Transaktion).

In diesem Tutorial zeige ich Ihnen, wie das Befehlsmuster zu einem nützlichen Entwurfsmuster für die Implementierung von Befehlswarteschlangen wird, bei denen Anforderungen für die sequentielle Verarbeitung in die Warteschlange gestellt werden können, während die tatsächliche Implementierung der Ausführung aus der Warteschlange selbst entkoppelt wird. Horiyan / Shutterstock

Befehlsdesignmuster FAQ (FAQ)

Was ist der Hauptzweck des Befehlsdesignmusters?

Befehlsdesignmuster wird hauptsächlich zum Entkoppeln des Absenders und des Empfängers von Anfragen verwendet. Dies bedeutet, dass der Absender die Details der durchgeführten Aktion oder des Empfängers der Anfrage nicht kennen muss. Stattdessen weiß der Absender, wie er einen Befehl ausgibt, und der Befehl weiß, wie er eine Anfrage ausführt. Dieser Modus ist besonders nützlich in Szenarien, in denen Sie die parametrisierten Objekte von Betrieb verwenden möchten und Anforderungen zu unterschiedlichen Zeiten anstellen, angeben und ausführen müssen.

Wie funktioniert das Befehlsdesignmuster?

Das Befehlsdesignmuster funktioniert, indem sie Anforderungen in Objekte einkapseln, sodass Benutzer Warteschlangen, Anforderungen und Operationen verwenden können, um Clients zu parametriieren. Es umfasst vier Komponenten: Befehl, Empfänger, Anrufer und Client. Der Befehl deklariert die Schnittstelle für den Vorgang, der Empfänger weiß, wie er den Vorgang ausführt, der Anrufer speichert den Befehl und bittet den Befehl irgendwann, die Anforderung auszuführen, indem er seine Ausführungsmethode aufruft, während der Client ein konkretes Objekt erstellt und seinen Empfänger festlegt.

Was sind die Vorteile der Verwendung von Befehlsdesignmustern?

Befehlsdesignmuster bieten viele Vorteile. Es entkoppelt die Klassen, die Operationen und Objekte aufrufen, die wissen, wie man Operationen ausführt, eine Reihe von Befehlen erstellen, indem Sie ein Warteschlangensystem bereitstellen. Sie können die Ausführung dieser Befehle steuern. Darüber hinaus unterstützt es unauffällig Operationen, da jeder Befehl ein Objekt mit einer bestimmten Methode ist.

Wann sollte ich Befehlsdesignmuster verwenden?

Befehlsdesignmuster ist besonders nützlich, wenn Sie eine Anfrage an ein Objekt stellen müssen, ohne zu kennen, dass die angeforderte Aktion oder den Empfänger der Anfrage. Es ist auch vorteilhaft, wenn Sie die operametrisierten Objekte verwenden müssen und Anforderungen zu unterschiedlichen Zeiten angeben, angeben und ausführen müssen.

Können Sie ein Beispiel für das verwendete Befehlsdesignmuster angeben?

Ein häufiges Beispiel für Befehlsdesignmuster ist die Implementierung eines Menüsystems in einer grafischen Benutzeroberfläche (GUI). Jede Aktion im Menü kann ein Befehl sein. Wenn der Benutzer auf ein Menüelement klickt, wird der Befehl, der dem Element zugeordnet ist, ausgeführt.

Was ist der Unterschied zwischen Befehls- und Richtlinienentwurfsmustern?

Obwohl beide Modi Algorithmen in eine separate Komponente einkapseln, ist ihr Zweck unterschiedlich. Bei dem Befehlsmodus geht es darum, die Verantwortung für die Ausgabe eines Befehls aus der Verantwortung für die Ausführung eines Befehls zu trennen und die Ausführung eines Befehls zu vereinfachen. Andererseits geht es im politischen Muster darum, eine Reihe von Algorithmen zu definieren, jeden Algorithmus zu verkörpern und sie austauschbar zu machen.

Kann das Befehlsdesign -Muster für Rückgängiggänge verwendet werden?

Ja, das Befehlsdesign -Muster kann unaufkundliche Operationen unterstützen. Dazu muss die Befehlsklasse einen Zustand beibehalten, der ihre Wirkung umkehrt und eine Rückgabemethode implementiert, die das Objekt in seinen vorherigen Zustand wiederherstellt.

Ist das Befehlsdesign -Muster für die Multithreading -Programmierung geeignet?

Ja, Befehlsdesignmuster sind bei der Multithread -Programmierung sehr nützlich. Sie können Anforderungen in Objekte einkapseln, die dann in separaten Threads ausgeführt werden können. Dies kann die Threadsynchronisation erheblich vereinfachen.

Wie besteht die Beziehung zwischen Befehlsdesignmustern und objektorientierten Designprinzipien?

Befehlsdesignmuster ist ein gutes Beispiel für die Kapselung - eines der Grundprinzipien des objektorientierten Designs. Es fasst Anforderungen in Objekte zusammen, sodass Sie Clients mit unterschiedlichen Anforderungen parametrisieren können.

Was sind die Nachteile der Verwendung von Befehlsdesignmustern?

Während das Befehlsdesignmuster viele Vorteile hat, ist es nicht ohne Mängel. Der Hauptnachteil besteht darin, dass die Anzahl der Klassen zu einer Erhöhung der Klassen führt, da jeder Befehl durch eine separate Klasse dargestellt wird. Dies kann das System komplexer und schwieriger zu verstehen.

Das obige ist der detaillierte Inhalt vonDas Befehlsdesign -Muster verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage