Es gibt viele Erklärungen zu Befehlsmustern, aber ich fand es etwas schwierig, das Beispiel in diesen Blogs / Beiträgen zu verdauen oder zu verstehen.
Also, hier werde ich versuchen, es so zu erklären, wie ich es verstanden habe.
Um das Befehlsmuster zu verstehen, gehen wir zurück in die 1990er Jahre, als wir riesige Fernseher ohne Fernbedienung hatten (zumindest in Indien). Gute alte Zeiten 😉
Wir hatten alle Knöpfe für Ein / Aus, Erhöhen / Verringern der Lautstärke.
Alles war gut, funktionierte gut, das einzige Problem war, wenn jemand den Fernseher ein- / ausschalten oder die Lautstärke verringern / erhöhen wollte, musste er den ganzen Weg zum Fernseher gehen und den Knopf benutzen.
Denken Sie nun objektorientiert. Ein Fernseher ist ein Objekt, das eine Reihe von Operationen / Methoden / Funktionen oder „Befehlen“ enthält. Wir greifen direkt auf das TV-Objekt zu, um diese Befehle aufzurufen.
Das Problem mit diesem Ansatz?
- Sie benötigen das Objekt, um einen Befehl aufzurufen – gehen Sie daher den ganzen Weg zum Fernseher
- Jeder Fernseher hat seine eigene Implementierung von Start / Stop und wir können den „Befehlsaufruf“ nicht wiederverwenden
- Wenn ein anderes Gerät, z. B. „Set-Top-Box“, dieselbe Funktionalität wünscht, können dieselben Vorgänge nicht wiederverwendet werden — „Universalfernbedienung“
Wie können wir das lösen?
Stellen Sie sich vor, das Fernsehgerät verfügt über eine Schnittstelle, die Ein / Aus und andere Funktionen implementiert und diese Methoden / Vorgänge verfügbar macht, indem die Instanz der Schnittstelle einem „anderen Objekt“ zugewiesen wird. Das könnte unser Problem lösen. Kommen wir zum Code:
Zuerst erstellen wir eine TV-Klasse, die die Operationen ein / Aus hat.
Ebenso werden wir eine Set-Top-Box-Klasse erstellen, da wir eine Universalfernbedienung erstellen.
Nachdem wir unsere Geräte und ihre Operationen definiert haben, benötigen wir eine Klasse(Befehl), die Objekte von TV / SetTopBox und diese Operationen aufrufen kann.
Lassen Sie uns unsere Befehlsklasse erstellen. Da wir zwei Operationen auf diesen Geräten ausführen möchten, „hat“ die Befehlsklasse ein Objekt vom Typ iDevice.
Wir benötigen zwei Befehle „ON“ und „OFF“.
Diese Ein / Aus-Befehlsobjekte haben eine execute Funktion / Methode, die die entsprechende Operation auf dem Gerät aufruft, das sie hat.
Wenn Sie bemerkt haben, habe ich die Klassen mit dem Namen „OnCommad“ und nicht „TVOnCommand“ erstellt. Die Idee ist, die Befehlsklasse für verschiedene Geräte wiederzuverwenden. Das ist unser universeller Befehl, der jedes Gerät unterstützt.
Dies ermöglicht es uns, eine Universalfernbedienung zu erstellen. Bingo!!!!
Bis jetzt haben wir die Geräteoperationen in Form von „Befehl“ abstrahiert. Das einzige, was für uns übrig bleibt, ist eine Fernbedienung zu erstellensteuerung, um den „Befehl“ auszulösen.
Bevor wir die Fernbedienung erstellen, müssen wir Schaltflächen erstellen, und jede Taste führt den entsprechenden Befehl aus.
Die RemoteButton-Klasse verfügt über ein command-Objekt, das beim Drücken der Taste ausgeführt wird.
Zum Schluss erstellen wir unser Fernbedienungsgerät, das für jede Operation mehrere Tasten hat.
Wenn wir ein Fernbedienungsgerät erstellen (mithilfe des Konstruktors), instanziieren wir alle Objekte und weisen sie zu.
Wenn Sie sich den obigen Code ansehen, haben wir mehrere Tasten in unserer Fernbedienung definiert und versuchen, eine Universalfernbedienung zu erstellen.
Wir sind bereit, mit unserem RemoteControlDevice zu erstellen und zu spielen 🙂
Ausgang:
TV is on!
TV is off!
SetTopBox is on!
SetTopBox is off!Process finished with exit code 0
Wie in der Ausgabe zu sehen, habe ich verschiedene Tasten gedrückt, um eine Reihe von Vorgängen an den Geräten auszuführen.
Kurz gesagt, die Idee ist, dem Client (psvm / TV-Benutzer) eine Fernbedienung zu geben, anstatt ihn den ganzen Weg zum Fernseher laufen zu lassen oder den Fernseher ein- und auszuschalten:D
Fazit
In diesem Beitrag haben wir über das Befehlsentwurfsmuster gesprochen.
In einfachen Worten:
Die Idee ist, die Operationen in einem anderen Objekt (Befehl) zu kapseln und wiederzuverwenden und dann mehrere Schaltflächen zu erstellen, um diese Befehlsobjekte auszuführen, die Geräteoperationen enthalten.
Wie üblich finden Sie den gesamten Code auf meinem GitHub.