{"id":4328,"date":"2024-03-01T12:16:51","date_gmt":"2024-03-01T12:16:51","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=4328"},"modified":"2025-07-07T11:36:36","modified_gmt":"2025-07-07T11:36:36","slug":"java-strategy","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-strategy\/","title":{"rendered":"Java-Entwurfsmuster (design pattern): Strategy"},"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; Strategy. 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 Strategy?<\/h2>\n<p><strong>Strategy<\/strong> ist ein Entwurfsmuster, das es erm\u00f6glicht, das Verhalten einer Klasse oder ihre Algorithmen dynamisch zur Laufzeit anzupassen. Wenn wir beispielsweise eine Klasse haben, die Daten validiert, muss ihre Struktur vor dem Programmstart nicht bekannt sein. Die Entscheidung, welcher Validierungsalgorithmus verwendet wird, erfolgt erst unmittelbar vor der Anwendung.    <\/p>\n<h2>Was f\u00fcr ein Problem l\u00f6st das Entwurfsmuster Strategy?<\/h2>\n<p> Das Entwurfsmuster <strong>Strategy <\/strong> l\u00f6st das Problem, wenn wir flexibel den Weg \u00e4ndern m\u00fcssen, wie eine bestimmte Funktionalit\u00e4t zur Laufzeit implementiert wird. Es erm\u00f6glicht, eine Familie von Algorithmen oder Strategien zu definieren, jede in einer eigenen Klasse zu kapseln und sicherzustellen, dass die Objekte dieser Klassen austauschbar sind. Das Hauptziel des Entwurfsmuster Strategy ist es, die M\u00f6glichkeit zu bieten, das Verhalten eines Objekts dynamisch basierend auf der gew\u00e4hlten Strategie zu \u00e4ndern. Zum Wechseln der Strategien wird ein Kontextobjekt verwendet, das eine Referenz auf das Strategieobjekt h\u00e4lt und dessen Methoden aufrufen kann. <\/p>\n<h2>Ein Beispiel f\u00fcr eine Strategie-Implementierung in Java.<\/h2>\n<p> Dieser Code demonstriert die Verwendung des Entwurfsmuster <strong>Strategy<\/strong> im Kontext eines Eishockeytrainers (Coach) und seiner F\u00e4higkeit, das Spiel zwischen Offensiv- und Defensivstrategien auf der Grundlage des aktuellen Stands des Spiels zu wechseln. <strong><u>HernaStrategia.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic interface HernaStrategia {\n    void vykonat();\n}<\/code><\/pre>\n<p><strong> HernaStrategia<\/strong> ist ein Interface, das definiert, wie eine Strategie implementiert werden kann. Sie enth\u00e4lt eine einzige <em>vykonat()<\/em>-Methode, die definiert, wie die Strategie ausgef\u00fchrt werden soll. <strong><u>UtocnaStrategia.java, ObrannaStrategia.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class UtocnaStrategia implements HernaStrategia {\n    @Override\n    public void vykonat() {\n        System.out.println(&quot;T\u00edm hr\u00e1 v \u00fato\u010dnej form\u00e1cii.&quot;);\n    }\n}\n\npublic class ObrannaStrategia implements HernaStrategia {\n    @Override\n    public void vykonat() {\n        System.out.println(&quot;T\u00edm prech\u00e1dza do obrannej form\u00e1cie.&quot;);\n    }\n}<\/code><\/pre>\n<p><strong>UtocnaStrategia<\/strong> und <strong>ObrannaStrategia<\/strong> sind konkrete Implementierungen der Schnittstelle <strong>HernaStrategia<\/strong>. Jede dieser Klassen implementiert die Methode <em>vykonat()<\/em>, um eine spezifische Strategie auszuf\u00fchren \u2013 entweder eine Angriffsstrategie oder eine Verteidigungsstrategie. <strong><u>Coach.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Kontext\npublic class Coach {\n    private HernaStrategia hernaStrategia;\n\n    public void zmenitStrategiu(HernaStrategia novaStrategia) {\n        this.hernaStrategia = novaStrategia;\n    }\n\n    public void vykonatStrategiu() {\n        hernaStrategia.vykonat();\n    }\n}<\/code><\/pre>\n<p> Coach ist ein Kontext, der eine Strategie anwendet. Coach hat ein Attribut hernaStrategia, das die aktuelle Strategie speichert. Die Methode <em>zmenitStrategiu()<\/em> dient dazu, die aktuelle Strategie zu \u00e4ndern, und die Methode v<em>ykonatStrategiu()<\/em> f\u00fchrt sie aus. <strong><u>Main.java<\/u><\/strong> <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import designpatterns.Coach;\nimport designpatterns.HernaStrategia;\nimport designpatterns.ObrannaStrategia;\nimport designpatterns.UtocnaStrategia;\n\npublic class Main {\n    public static void main(String[] args) {\n        Coach coach = new Coach();\n        HernaStrategia utocnaStrategia = new UtocnaStrategia();\n        HernaStrategia obrannaStrategia = new ObrannaStrategia();\n\n        System.out.println(&quot;Za\u010dala sa hra.&quot;);\n\n        \/\/ Coach vyber\u00e1 strat\u00e9giu pod\u013ea priebehu hry\n        \/\/ Za\u010d\u00edname s \u00fato\u010dnou strat\u00e9giou\n        coach.zmenitStrategiu(utocnaStrategia);\n        coach.vykonatStrategiu();\n\n        System.out.println(&quot;T\u00edm striela g\u00f3l a vedie.&quot;);\n\n        \/\/ Ak t\u00edm vyhr\u00e1va, zmen\u00edme na obrann\u00fa strat\u00e9giu\n        \/\/ (simulujeme, \u017ee sa t\u00edm dost\u00e1va do obrannej f\u00e1zy, ke\u010f vedie v z\u00e1pase)\n        coach.zmenitStrategiu(obrannaStrategia);\n        coach.vykonatStrategiu();\n\n        System.out.println(&quot;S\u00faper striela g\u00f3l a vyrovn\u00e1va.&quot;);\n\n        \/\/ Ak t\u00edm prehr\u00e1va, m\u00f4\u017eeme sa op\u00e4\u0165 vr\u00e1ti\u0165 k \u00fato\u010dnej strat\u00e9gii\n        \/\/ (simulujeme, \u017ee t\u00edm znova prech\u00e1dza do \u00fato\u010dnej f\u00e1zy, ke\u010f prehr\u00e1va)\n        coach.zmenitStrategiu(utocnaStrategia);\n        coach.vykonatStrategiu();\n    }\n}<\/code><\/pre>\n<p> In <strong>Main <\/strong> wird eine Instanz von <strong>Coach <\/strong> und zwei Instanzen von Strategien \u2013 eine offensive und eine defensive \u2013 erstellt. Es folgt eine Spielsimulation, bei der die Strategien je nach Spielverlauf gewechselt werden. Die Ausgabe dieses Beispiels ist: <figure id=\"attachment_2840\" aria-describedby=\"caption-attachment-2840\" style=\"width: 450px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2838\" src=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/03\/vystup-z-prikladu-strategy-450-325.webp\" alt=\"Ausgabe des Programms f\u00fcr das Entwurfsmuster Strategie.\" width=\"450\" height=\"325\" srcset=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/03\/vystup-z-prikladu-strategy-450-325.webp 450w, https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/03\/vystup-z-prikladu-strategy-450-325-300x217.webp 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><figcaption id=\"caption-attachment-2840\" class=\"wp-caption-text\">Ausgabe des Beispiels f\u00fcr das Entwurfsmuster Strategy.<\/figcaption><\/figure>  <\/p>\n<h2>Zusammenfassung<\/h2>\n<p> Das Entwurfsmuster <strong>Strategy <\/strong> wird h\u00e4ufig verwendet, wenn wir das Verhalten einer Klasse oder ihre Strategien dynamisch nach Bedarf zur Laufzeit \u00e4ndern m\u00fcssen.  Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausf\u00fchren kannst. Lade <a href=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/Strategy.zip\">den Java <strong>Strategy<\/strong> Code hier<\/a> herunter. Wenn du einen Job suchst und <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/java-entwickler-senior\/\">Java-Programmierer<\/a> bist, informiere dich \u00fcber unsere <a href=\"https:\/\/msg-life.sk\/de\/mitarbeiter-benefits\/\">Sozialleistungen<\/a> 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 Java-Entwurfsmuster Strategy und wof\u00fcr wird es verwendet? Lies unseren neuen Artikel und lade den Beispielcode herunter.<\/p>\n","protected":false},"author":14,"featured_media":2834,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-4328","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\/4328","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=4328"}],"version-history":[{"count":3,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4328\/revisions"}],"predecessor-version":[{"id":8045,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4328\/revisions\/8045"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/2834"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=4328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=4328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=4328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}