{"id":2320,"date":"2019-11-04T13:29:54","date_gmt":"2019-11-04T10:29:54","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2320"},"modified":"2024-12-16T22:32:32","modified_gmt":"2024-12-16T19:32:32","slug":"command-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2019\/11\/04\/command-pattern\/","title":{"rendered":"Musterbefehl"},"content":{"rendered":"<p><a href=\"https:\/\/pixabay.com\/illustrations\/vegan-go-vegan-compassion-sign-1343429\/\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2327\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/govegan.png\" alt=\"\" width=\"400\" height=\"260\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/govegan.png 400w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/11\/govegan-300x195.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>Befehlsmuster bezieht sich auf Verhaltensentwurfsmuster.<\/p>\n<p>Das ist das Muster, an dem ich am l\u00e4ngsten festgehalten habe. Es ist so einfach, dass es sehr komplex ist. Aber ich pers\u00f6nlich finde, dass das Sch\u00f6ne am Selbststudium darin besteht, dass man alle Zeit der Welt hat, ein bestimmtes Thema aus allen Blickwinkeln zu recherchieren.<\/p>\n<p>In GoF wird die Anwendbarkeit also recht pr\u00e4gnant und klar beschrieben:<br \/><b><i>Verkapselt eine Anfrage als Objekt und erm\u00f6glicht es Ihnen, Clients mit unterschiedlichen Anfragen zu parametrisieren, Warteschlangen zu verwenden, Anfragen zu protokollieren und Abbruchvorg\u00e4nge durchzuf\u00fchren.<\/i><\/b><\/p>\n<p>Jetzt implementieren wir eine einfache Version des Befehls aus der Beschreibung:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>string fakeTrumpsRequest = \u201cSELECT * from Users where name beginsWith DonaldTrump\u201d\n<\/code><\/pre>\n<\/div>\n<p>Wir haben die Anfrage in ein String-Klassenobjekt gekapselt. Es kann zum Konfigurieren von Clients, zum Hinzuf\u00fcgen von Befehlen zur Warteschlange, zum Protokollieren und zum Abbrechen (unter Verwendung des \u201eSnapshot\u201c-Musters) verwendet werden.<\/p>\n<p>Mir scheint, dass dies v\u00f6llig ausreicht, um SQL-Abfragen und dergleichen durchzuf\u00fchren, aber dann gibt es noch Implementierungsdetails, unterschiedliche Anwendungsm\u00f6glichkeiten, die Codebasis des Musters, Client-Rollen und Hilfsklassen sind ebenfalls sehr unterschiedlich. <\/p>\n<h3>Materialteile<\/h3>\n<p>Das <\/p>\n<p>Befehlsmuster beginnt mit einem <b>Befehlsprotokoll<\/b>, das eine einzelne <b>execute()<\/b>-Methode enth\u00e4lt. Als n\u00e4chstes kommt der <b>Spezifische Befehl und Empf\u00e4nger<\/b>. Der CC implementiert die Operation auf dem Empf\u00e4nger und beschreibt die Verbindung zwischen dem Empf\u00e4nger und der Aktion. Ist etwas unklar? Ich auch, aber lasst uns weitermachen. Der <b>Client<\/b>erstellt eine Instanz eines <b>Spezifischen Befehls<\/b> und verkn\u00fcpft ihn mit dem <b>Empf\u00e4nger<\/b>. <b>Aufrufer<\/b> &#8211; Objekt, das den Prozess des Startens von <b>Befehlen<\/b> ausf\u00fchrt.<\/p>\n<p>Jetzt versuchen wir es anhand eines Beispiels herauszufinden. Nehmen wir an, wir m\u00f6chten myOS auf myPhone aktualisieren. Dazu starten wir die Anwendung myOS_Update! und dr\u00fccken darin die Schaltfl\u00e4che \u201eJetzt aktualisieren\u201c. Nach 10 Sekunden wird das System dies tun Melden Sie ein erfolgreiches Update.<\/p>\n<p><b>Der Client <\/b>im obigen Beispiel ist die myOS_Update!-Anwendung, der <b>Invoker<\/b> ist die Schaltfl\u00e4che \u201eJetzt aktualisieren!\u201c und startet den <b>Spezifischen Befehl <\/ b>Aktualisierung des Systems mithilfe der Methodeexecute(), die auf den <b>Receiver<\/b> zugreift. Betriebssystem-Update-Daemon.<\/p>\n<h3>Beispiel verwenden<\/h3>\n<p>Akzeptieren wir die Benutzeroberfl\u00e4che der myOS_Update-Anwendung! so gut, dass sie beschlossen, es als separates Produkt zu verkaufen, um eine Schnittstelle f\u00fcr die Aktualisierung anderer Betriebssysteme bereitzustellen. In diesem Fall implementieren wir eine Anwendung mit Unterst\u00fctzung f\u00fcr Erweiterungen durch Bibliotheken. In den Bibliotheken wird es Implementierungen von <b>Spezifischen Befehlen und Empf\u00e4ngern<\/b> geben. Wir belassen den statischen\/unver\u00e4nderlichen <b>Invoker<\/b> , <b>Client<\/b>, Protokoll <b>Befehle<\/b>.<\/p>\n<p>Es besteht also keine Notwendigkeit, ver\u00e4nderlichen Code zu unterst\u00fctzen, da unser Code unver\u00e4ndert bleibt und Probleme aufgrund von Fehlern im Code ihrer <b>Spezifischen Befehle<\/b> nur bei der Implementierung auf der Clientseite auftreten k\u00f6nnen <b>Empf\u00e4nger<\/b>. Au\u00dferdem besteht in dieser Implementierung keine Notwendigkeit, den Quellcode der Hauptanwendung zu \u00fcbertragen, d. h. wir haben Befehle und UI-Interaktionen mithilfe des Musters <b>Befehl<\/b> gekapselt.<\/p>\n<h3>Quellen<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/command\" target=\"_blank\" rel=\"noopener\">https:\/\/refactoring.guru\/ru\/design-patterns\/command <\/a><br \/><a href=\"https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612\" target=\"_blank\" rel=\"noopener\">https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Befehlsmuster bezieht sich auf Verhaltensentwurfsmuster. Das ist das Muster, an dem ich am l\u00e4ngsten festgehalten habe. Es ist so einfach, dass es sehr komplex ist. Aber ich pers\u00f6nlich finde, dass das Sch\u00f6ne am Selbststudium darin besteht, dass man alle Zeit der Welt hat, ein bestimmtes Thema aus allen Blickwinkeln zu recherchieren. In GoF wird die<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2019\/11\/04\/command-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Musterbefehl&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[127,95],"class_list":["post-2320","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-command","tag-patterns","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"de","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2320"}],"version-history":[{"count":14,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2320\/revisions"}],"predecessor-version":[{"id":3935,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2320\/revisions\/3935"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}