{"id":3930,"date":"2024-01-12T14:00:06","date_gmt":"2024-01-12T14:00:06","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=3930"},"modified":"2025-07-07T11:36:27","modified_gmt":"2025-07-07T11:36:27","slug":"java-command","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-command\/","title":{"rendered":"Java-Entwurfsmuster (design patterns): Command"},"content":{"rendered":"<p>Heute werfen wir einen Blick auf das n\u00e4chste <strong>Entwurfsmuster <\/strong> (Java <strong>design patterns<\/strong>) aus der Kategorie der Verhaltensmuster (<strong>Behavioral Patterns<\/strong>) &#8211; Command. Entwurfsmuster in dieser Kategorie befassen sich mit der Kommunikation <strong>(interaction<\/strong>) zwischen Objekten und ihrer Verantwortung (<strong>responsibility<\/strong>). <\/p>\n<h2>Was ist das Entwurfsmuster Command ?<\/h2>\n<p> <strong>Command <\/strong> ist ein Entwurfsmuster, das Anforderungen oder Operationen zusammen mit den Informationen zu deren Ausf\u00fchrung in separate Objekte verpackt. Diese Informationen umfassen meist den Methodennamen des entsprechenden Objekts sowie die Methodenparameter. Mit dem Muster sind immer die Begriffe <strong><em>Client<\/em><\/strong> (Klient), <strong><em>Command<\/em><\/strong> (Befehl), <strong><em>Receiver<\/em><\/strong> (Empf\u00e4nger) und <strong><em>Invoker<\/em><\/strong> (Ausl\u00f6ser) verbunden. Der Kunde entscheidet, welcher Auftrag zu welchem Zeitpunkt ausgef\u00fchrt wird. Um den Befehl auszuf\u00fchren, verschiebt er das Befehlsobjekt des aufrufenden Objekts. Der Aufforderer wei\u00df nichts \u00fcber ein bestimmtes Objekt, er kennt nur seine Schnittstelle. Seine Aufgabe ist es, den Befehl durch Aufruf der Methode <em>Execute <\/em> auszuf\u00fchren und ggf. die Details der aufgerufenen Operation zu speichern. Der Empf\u00e4nger f\u00fchrt den Auftrag dann \u00fcber das Befehlsobjekt aus. <\/p>\n<h2>Welches Problem wird durch das Entwurfsmuster Command gel\u00f6st?<\/h2>\n<p> Es l\u00f6st das Problem der Trennung zwischen dem Objekt, das eine Operation aufruft (dem Aufrufer) und dem Objekt, das diese Operation ausf\u00fchrt (dem Empf\u00e4nger). Das Hauptziel besteht darin, eine flexible Verbindung zwischen den Objekten zu schaffen, die Anfragen ausl\u00f6sen, und denen, die sie verarbeiten. Diese Objekte enthalten alle Informationen, die f\u00fcr die Durchf\u00fchrung eines bestimmten Vorgangs im Hintergrund erforderlich sind. Auf diese Weise ist es m\u00f6glich, Client-Anfragen mit unterschiedlichen Parametern zu bearbeiten. Anfragen k\u00f6nnen zur Bearbeitung in eine Warteschlange gestellt, protokolliert oder sogar umgekehrte Operationen durchgef\u00fchrt werden. <\/p>\n<h2>Beispiel f\u00fcr die Implementierung eines Befehls in Java<\/h2>\n<p> Das Entwurfsmuster ist etwas komplizierter zu verstehen, daher habe ich ein Beispiel vorbereitet, in dem wir die Rollen <em>Client<\/em>, <em>Command<\/em>, <em>Receiver<\/em> und <em>Invoker<\/em> n\u00e4her erl\u00e4utern werden. Wir werden ein einfaches Programm schreiben, das die Taschenlampe \u00fcber Befehle steuern wird. <strong><u>Prikaz.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Command rozhranie\npublic interface Prikaz {\n    void vykonat();\n}<\/code><\/pre>\n<p> Die Schnittstelle <strong>Prikaz<\/strong> definiert die Operation <em>vykonaj()<\/em>, die von allen konkreten Befehlen implementiert wird. <strong><u>ZapnutSvetlo.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Konkr\u00e9tny pr\u00edkaz\npublic class ZapnutSvetlo implements Prikaz {\n    private Baterka baterka;\n\n    public ZapnutSvetlo(Baterka baterka) {\n        this.baterka = baterka;\n    }\n\n    @Override\n    public void vykonat() {\n        baterka.zapnut();\n    }\n}<\/code><\/pre>\n<p><strong><u>VypnutSvetlo.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Konkr\u00e9tny pr\u00edkaz\npublic class VypnutSvetlo implements Prikaz {\n    private Baterka baterka;\n\n    public VypnutSvetlo(Baterka baterka) {\n        this.baterka = baterka;\n    }\n\n    @Override\n    public void vykonat() {\n        baterka.vypnut();\n    }\n}<\/code><\/pre>\n<p> Insbesondere die Befehle <strong>ZapnutSvetlostrong<\/strong> und <strong>VypnutSvetlo<\/strong> implementieren die Schnittstelle <strong>Prikazstrong<\/strong> und enthalten einen Verweis auf ein bestimmtes <strong>Baterka,<\/strong> das die entsprechende Operation ausf\u00fchrt. <strong><u>Baterka.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Receiver\npublic class Baterka {\n    public void zapnut() {\n        System.out.println(&quot;Baterka svieti&quot;);\n    }\n    public void vypnut() {\n        System.out.println(&quot;Baterka je vypnuta&quot;);\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>Baterka<\/strong> stellt einen <em>Receiver<\/em> dar und enth\u00e4lt die Methoden, die bei der Ausf\u00fchrung der Befehle aufgerufen werden. <strong><u>Vypinac.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Invoker\npublic class Vypinac {\n    private Prikaz prikaz;\n\n    public void nastavPrikaz(Prikaz prikaz) {\n        this.prikaz = prikaz;\n    }\n\n    public void stlacitTlacidlo() {\n        prikaz.vykonat();\n    }\n}<\/code><\/pre>\n<p> Klasse <strong>Vypinac<\/strong> stellt einen <em>Invoker<\/em> dar und enth\u00e4lt einen Verweis auf ein Objekt vom Typ <strong>Command<\/strong> und verf\u00fcgt \u00fcber eine Methode <em>stlacitTlacidlo()<\/em>, die die Operation <em>vykonat()<\/em> des entsprechenden Befehls aufruft.  <strong><u>Main.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">import designpatterns.*;\n\n\/\/ Klient\npublic class Main {\n    public static void main(String[] args) {\n        \/\/ Receiver\n        Baterka baterka = new Baterka();\n        \/\/ Command(s)\n        Prikaz zapnutSvetlo = new ZapnutSvetlo(baterka);\n        Prikaz vypnutSvetlo = new VypnutSvetlo(baterka);\n        \/\/ Invoker\n        Vypinac vypinac = new Vypinac();\n        \/\/ Nastavenie a spustenie pr\u00edkazu.\n        vypinac.nastavPrikaz(zapnutSvetlo);\n        vypinac.stlacitTlacidlo();\n        \/\/ Nastavenie a spustenie in\u00e9ho pr\u00edkazu.\n        vypinac.nastavPrikaz(vypnutSvetlo);\n        vypinac.stlacitTlacidlo();\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>Main<\/strong> stellt den Client dar. In der <em>Hauptmethode<\/em> erstellen wir Befehle zur Steuerung der Taschenlampe und verkn\u00fcpfen sie mit dem Empf\u00e4nger, der sie verarbeiten wird. Wir werden auch ein Invoker-Objekt erstellen &#8211; einen Schalter, \u00fcber den der Client einen bestimmten Befehl setzt, der nach dem Aufruf der Methode <em>stacitTlacidlo()<\/em> ausgef\u00fchrt wird. Einfach ausgedr\u00fcckt: Der Client sendet Befehle an den Schalter, der die Taschenlampe steuert. Die Ausgabe dieses Beispiels ist: <img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-2428\" src=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/01\/vystup-z-prikladu-700-270-300x116.webp\" alt=\"Java Entwurfsmuster: Command (Entwurfsmuster) \" width=\"300\" height=\"116\" srcset=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/01\/vystup-z-prikladu-700-270-300x116.webp 300w, https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/01\/vystup-z-prikladu-700-270.webp 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2>Zusammenfassung<\/h2>\n<p> Das Entwurfsmuster <strong>Command<\/strong> wird h\u00e4ufig verwendet, wenn wir die Abh\u00e4ngigkeit einer Anfrage mit einer direkten konkreten Implementierung loswerden m\u00fcssen. Es hat eine breite Palette von Anwendungen in der grafischen Benutzeroberfl\u00e4che, Netzwerkkommunikation, Datenbanktransaktionen, etc. Wir haben f\u00fcr dich die Dateien mit dem erw\u00e4hnten Beispiel in Form von Code vorbereitet, den du direkt in Java ausf\u00fchren kannst. <a href=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/01\/Command.zip\">Lade den Code Java <strong>Command <\/strong> hier herunter<\/a>. Wenn du <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/java-entwickler-senior\/\">Java-Programmierer<\/a> bist und nach einem Job suchst, schau dir unsere <a href=\"https:\/\/msg-life.sk\/de\/mitarbeiter-benefits\/\">Mitarbeiterbenefits <\/a> an und reagiere auf unsere <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/\">aktuellen Stellenangebote.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist das Entwurfsmuster Command und wof\u00fcr wird es verwendet? Lies unseren neuen Artikel und lade den Beispielcode herunter.<\/p>\n","protected":false},"author":14,"featured_media":2433,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-3930","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3930","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/comments?post=3930"}],"version-history":[{"count":5,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3930\/revisions"}],"predecessor-version":[{"id":8022,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3930\/revisions\/8022"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/2433"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=3930"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=3930"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=3930"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}