Heim >Backend-Entwicklung >PHP-Tutorial >Das Befehlsdesign -Muster verstehen
Kernpunkte
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; } }
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(); }
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"; } }
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();
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:
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)
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.
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.
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.
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.
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.
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.
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.
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.
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.
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!