{"id":4323,"date":"2024-02-23T16:00:26","date_gmt":"2024-02-23T16:00:26","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=4323"},"modified":"2025-07-07T11:36:36","modified_gmt":"2025-07-07T11:36:36","slug":"java-state","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-state\/","title":{"rendered":"Java-Entwurfsmuster (design pattern): State"},"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; State. 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 State?<\/h2>\n<p><strong>State <\/strong> ist ein Entwurfsmuster, das es einem Objekt erm\u00f6glicht, sein Verhalten zu \u00e4ndern, wenn sich sein interner Zustand \u00e4ndert. Im Muster erstellen wir Objekte, die die einzelnen Zust\u00e4nde darstellen, sowie ein Kontextobjekt, dessen Verhalten sich in Abh\u00e4ngigkeit vom Zustand des Objekts \u00e4ndert. Zur besseren Verst\u00e4ndlichkeit stellen wir uns einen einfachen Ticketautomaten vor. Sein Verhalten \u00e4ndert sich je nach Phase des Kaufprozesses (konkreter Zustand), in der er sich befindet (z. B. Ticketauswahl, Bezahlung, Best\u00e4tigung). Die Implementierung dieses automatisierten Prozesses mithilfe des State-Entwurfsmusters w\u00fcrde den Code \u00fcbersichtlicher machen, da die Gesch\u00e4ftslogik jeder Phase in separate Zust\u00e4nde aufgeteilt w\u00fcrde. <\/p>\n<h2>Was f\u00fcr ein Problem l\u00f6st das Entwurfsmuster State?<\/h2>\n<p> Das Entwurfsmuster <strong>State <\/strong> l\u00f6st das Problem, wenn sich ein Objekt je nach seinem aktuellen Zustand unterschiedlich verh\u00e4lt. Es erm\u00f6glicht, verschiedene Zust\u00e4nde und \u00dcberg\u00e4nge zwischen ihnen zu definieren, wodurch die Zustandslogik von der Hauptlogik des Objekts getrennt wird. Dieses Konzept \u00e4hnelt endlichen Automaten (<strong>FSM <\/strong> \u2013 Finite State Machine). Das Verhalten jedes Zustands wird unabh\u00e4ngig von den anderen Zust\u00e4nden definiert, und das Hinzuf\u00fcgen neuer Zust\u00e4nde sollte das Verhalten der bestehenden Zust\u00e4nde nicht beeinflussen.    <\/p>\n<h2>Ein Beispiel f\u00fcr eine State-Implementierung in Java.<\/h2>\n<p> Hier ist ein praktisches Beispiel f\u00fcr die Implementierung des <strong>State<\/strong>-Entwurfsmusters in Java am Beispiel einer Ampel mit den Zust\u00e4nden Rot, Gelb und Gr\u00fcn, die den Stra\u00dfenverkehr <strong><u>StavSemaforu.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic interface StavSemaforu {\n    void vykonat();\n}<\/code><\/pre>\n<p><strong>StavSemaforu<\/strong> ist ein Interface, das die Methode <em>vykonat() <\/em> definiert. Jeder Zustand der Ampel (Rot, Gelb, Gr\u00fcn) implementiert dieses Interface und bietet eine eigene Implementierung von <em>vykonat()<\/em>. <strong><u>Cervena.java, Oranzova.javaZelena.java<\/u><\/strong> <\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class Cervena implements StavSemaforu {\n    @Override\n    public void vykonat() {\n        System.out.println(&quot;Svetlo na semafore sa preplo na \u010derven\u00fa - prem\u00e1vka sa zastavila.&quot;);\n    }\n}\n\npublic class Oranzova implements StavSemaforu {\n    @Override\n    public void vykonat() {\n        System.out.println(&quot;Svetlo na semafore sa preplo na oran\u017eov\u00fa - \u010dak\u00e1 sa na zmenu.&quot;);\n    }\n}\n\npublic class Zelena implements StavSemaforu {\n    @Override\n    public void vykonat() {\n        System.out.println(&quot;Svetlo na semafore sa preplo na zelen\u00fa - prem\u00e1vka sa rozbieha.&quot;);\n    }\n}<\/code><\/pre>\n<p> <strong>Cervena<\/strong>, <strong>Oranzova <\/strong> und <strong>Zelena <\/strong> sind Implementierungen des Interfaces <strong>StavSemaforu<\/strong>. Jede dieser Klassen repr\u00e4sentiert einen konkreten Zustand der Ampel und bietet eine eigene Implementierung f\u00fcr <em>vykonat()<\/em>. <strong><u>Semafor.java<\/u><\/strong> <\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\n\/\/ Kontext, ktory prepina stavy\npublic class Semafor {\n    private StavSemaforu stav;\n\n    public Semafor() {\n        this.stav = new Oranzova();\n    }\n\n    public void prepnut(StavSemaforu novyStav) {\n        this.stav = novyStav;\n    }\n\n    public void vykonat() {\n        stav.vykonat();\n    }\n}<\/code><\/pre>\n<p> <strong>Semafor <\/strong> ist eine Klasse, die den Kontext darstellt, in dem sich die Zust\u00e4nde der Ampel \u00e4ndern.   In diesem Fall wird der Semafor auf den Zustand <strong>Oranzova <\/strong> initialisiert. Er hat eine Methode <em>prepnut()<\/em>, die den aktuellen Zustand der Ampel auf den angegebenen neuen Zustand \u00e4ndert. Er hat auch eine Methode <em>vykonat()<\/em>, die den aktuellen Zustand der Ampel ausf\u00fchrt. <strong><u>Main.java<\/u><\/strong> <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import designpatterns.Cervena;\nimport designpatterns.Oranzova;\nimport designpatterns.Semafor;\nimport designpatterns.Zelena;\n\npublic class Main {\n    public static void main(String[] args) {\n        \/\/ Semafor je na zaciatku inicializovany na stav oranzova.\n        Semafor semafor = new Semafor();\n        semafor.vykonat();\n        semafor.prepnut(new Cervena());\n        semafor.vykonat();\n        semafor.prepnut(new Oranzova());\n        semafor.vykonat();\n        semafor.prepnut(new Zelena());\n        semafor.vykonat();\n    }\n}<\/code><\/pre>\n<p> In der Klasse <strong>Main <\/strong> simulieren wir den Betrieb der Verkehrsampel. Wir erstellen eine Instanz der Ampel, die zu Beginn im Zustand Gelb ist. Dann \u00e4ndern wir den Zustand der Ampel mit der Methode <em>prepnout()<\/em> und rufen anschlie\u00dfend die Methode <em>vykonat()<\/em> auf, die die f\u00fcr den aktuellen Zustand definierte Gesch\u00e4ftslogik verarbeitet.     Die Ausgabe dieses Beispiels ist: <img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2780 size-full\" src=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-state-830-240.webp\" alt=\"Beispiel f\u00fcr die Ausgabe des Java-Entwurfsmusters: State (design pattern) \" width=\"830\" height=\"240\" srcset=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-state-830-240.webp 830w, https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-state-830-240-300x87.webp 300w, https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-state-830-240-768x222.webp 768w\" sizes=\"auto, (max-width: 830px) 100vw, 830px\" \/><\/p>\n<h2>Zusammenfassung<\/h2>\n<p> Das Entwurfsmuster <strong>State <\/strong> ist n\u00fctzlich, wenn wir eine endliche Anzahl von Zust\u00e4nden definiert haben, die ein Objekt durchlaufen kann, und wir eine Aktion ausf\u00fchren m\u00fcssen, wenn sich sein interner Zustand \u00e4ndert. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausf\u00fchren kannst. Lade den J<a href=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/State.zip\">ava <strong>State <\/strong> Code hier herunter.<\/a> Wenn du ein <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/java-entwickler-senior\/\">Java-Programmierer<\/a> auf der Suche nach Arbeit bist, dann 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 Java-Entwurfsmuster State und wof\u00fcr wird es verwendet? Lies unseren neuen Artikel und lade den Beispielcode herunter.<\/p>\n","protected":false},"author":14,"featured_media":2776,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-4323","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\/4323","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=4323"}],"version-history":[{"count":4,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4323\/revisions"}],"predecessor-version":[{"id":8044,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4323\/revisions\/8044"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/2776"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=4323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=4323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=4323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}