{"id":3927,"date":"2024-02-05T12:00:27","date_gmt":"2024-02-05T12:00:27","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=3927"},"modified":"2025-07-07T11:36:33","modified_gmt":"2025-07-07T11:36:33","slug":"java-memento","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-memento\/","title":{"rendered":"Java-Entwurfsmuster (design pattern): Memento"},"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; Memento. 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 Memento Entwurfsmuster?<\/h2>\n<p> Das Entwurfsmuster <strong>Memento <\/strong> erm\u00f6glicht es, den internen Zustand des Objekts zu erhalten, ohne das<strong>Kapselungsprinzip<\/strong> zu verletzen. Dieser Zustand kann bei Bedarf wiederhergestellt werden, wodurch das Objekt in seinen urspr\u00fcnglichen Zustand zur\u00fcckkehrt. <\/p>\n<h2>Was f\u00fcr ein Problem l\u00f6st das Entwurfsmuster Memento?<\/h2>\n<p> In Anwendungen ist es durchaus \u00fcblich, den Status zu speichern, den der Benutzer als Eingabe in das Programm eingegeben hat, z.B. beim Ausf\u00fcllen eines Webformulars. Im Falle eines Internetausfalls ist es sinnvoll, den zuletzt gespeicherten Zustand der eingegebenen Daten wiederherzustellen, ohne den Benutzer erneut danach zu fragen. In \u00e4hnlichen Situationen, in denen wir den Zwischenzustand speichern und jederzeit leicht darauf zur\u00fcckgreifen m\u00fcssen, wird das Entwurfsmuster Memento verwendet. Das Prinzip besteht darin, die Speicherung des Zustands eines Objekts vom eigentlichen Objekt zu trennen. Ein Objekt, das seinen Zustand speichern m\u00f6chte, erstellt ein Memento-Objekt, das die erforderlichen Informationen \u00fcber den Zustand enth\u00e4lt. Dieses Memento-Objekt kann dann gespeichert werden (zum Beispiel in einer Historie) und sp\u00e4ter verwendet werden, um den urspr\u00fcnglichen Zustand des Objekts wiederherzustellen. Ein gut konzipiertes Objekt ist gekapselt, d. h. die Daten des Objekts sind im Inneren verborgen und von au\u00dferhalb des Objekts nicht zug\u00e4nglich, so dass das Objekt selbst &#8211; der <strong>Originator <\/strong> &#8211; f\u00fcr die Speicherung des internen Zustands im (<strong>Memento<\/strong>)-Objekt und dessen Wiederherstellung aus dem (<strong>Memento<\/strong>)-Objekt verantwortlich ist. Der Client (<strong>Caretaker<\/strong>) \u00fcbernimmt im Fall der Speicherung des Zustands das Memento-Objekt vom Originator-Objekt und gibt es ihm sp\u00e4ter zur\u00fcck, wenn der Zustand wiederhergestellt werden soll. Diese Methode erm\u00f6glicht es, den internen Zustand des Originator-Objekts zu speichern und wiederherzustellen, ohne seine Kapselung aufzubrechen. <\/p>\n<h2>Ein Beispiel f\u00fcr eine Memento-Implementierung in Java.<\/h2>\n<p> Um das Memento-Entwurfsmuster zu demonstrieren, zeigen wir, wie man den Zustand eines Objekts speichert und wiederherstellt, ohne das Prinzip der Kapselung zu verletzen. Dazu erstellen wir ein einfaches Spiel, in dem der Spieler durch gef\u00e4hrliche Levels geht, in denen er Verletzungen erleiden kann. Der Spieler kann jederzeit den Spielzustand speichern und ihn bei Bedarf wiederherstellen. <strong><u>Hra.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class Hra {\n    private int levelId;\n    private int zdravie;\n\n    public Hra() {\n        spustitHru();\n    }\n\n    public void spustitHru() {\n        this.levelId = 1;\n        this.zdravie = 100;\n        System.out.println(&quot;Sp\u00fa\u0161\u0165am nov\u00fa hru.&quot;);\n        ukazStavHry();\n    }\n\n    public Memento ulozitHru() {\n        System.out.println(&quot;Uklad\u00e1m stav hry.&quot;);\n        return new Memento(levelId, zdravie);\n    }\n\n    public void nacitatHru(Memento memento) {\n        System.out.println(&quot;Na\u010d\u00edtavam ulo\u017een\u00fa poz\u00edciu v hre.&quot;);\n        this.levelId = memento.getLevelId();\n        this.zdravie = memento.getZdravie();\n    }\n\n    public void dokoncitLevel() {\n        levelId++;\n        System.out.println(&quot;Pokra\u010dujem do levelu &quot; + levelId);\n        ukazStavHry();\n    }\n\n    public void zranitSa(int poskodenie) {\n        this.zdravie -= poskodenie;\n        System.out.println(&quot;Hr\u00e1\u010d utrpel zranenie (&quot; + -poskodenie + &quot;)&quot;);\n        ukazStavHry();\n        if (zdravie &lt;= 0) {\n            System.out.println(&quot;Hr\u00e1\u010d stratil cel\u00e9 zdravie. Hra za\u010dne od za\u010diatku.&quot;);\n            spustitHru();\n        }\n    }\n\n    public void ukazStavHry() {\n        System.out.println(&quot;    Level &quot; + levelId + &quot;, Zdravie: &quot; + zdravie);\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>Hra<\/strong> enth\u00e4lt Methoden zum Starten eines Spiels, Speichern eines Spiels, Laden eines Spiels, Abschlie\u00dfen eines Levels, Verletzen eines Spielers und Anzeigen des Spielstatus. <strong><u>Memento.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class Memento {\n    private int levelId;\n    private int zdravie;\n\n    public Memento(int levelId, int zdravie) {\n        this.levelId = levelId;\n        this.zdravie = zdravie;\n    }\n\n    public int getLevelId() {\n        return levelId;\n    }\n\n    public int getZdravie() {\n        return zdravie;\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>Memento<\/strong> dient als Objekt, das den Zustand des Spiels speichert. Das Memento speichert Informationen \u00fcber den aktuellen Level (<em>levelId<\/em>) und die Gesundheit (<em>zdravie<\/em>). <strong><u>Hranie.java <\/u><\/strong> <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import designpatterns.Hra;\nimport designpatterns.Memento;\n\npublic class Hranie {\n    public static void main(String[] args) {\n        Hra hra = new Hra();\n        hra.zranitSa(12);\n        hra.dokoncitLevel();\n        Memento ulozenaPozicia = hra.ulozitHru();\n        hra.zranitSa(24);\n        hra.zranitSa(18);\n        hra.dokoncitLevel();\n        hra.zranitSa(20);\n        hra.zranitSa(12);\n        hra.zranitSa(14);\n        hra.nacitatHru(ulozenaPozicia);\n        hra.ukazStavHry();\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>Hranie <\/strong> enth\u00e4lt die Methode <em>main<\/em>, in der die Verwendung des Memento-Entwurfsmusters demonstriert wird. Der Spieler startet das Spiel, erleidet Verletzungen, schlie\u00dft ein Level ab, speichert den Spielzustand (Memento), erleidet weitere Verletzungen, schlie\u00dft ein weiteres Level ab, erleidet erneut Verletzungen und l\u00e4dt schlie\u00dflich den Spielstand, um nicht von vorne beginnen zu m\u00fcssen. Die Ausgabe dieses Beispiels ist: <img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2684 size-full\" src=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-memento-385-550.webp\" alt=\"Beispiel f\u00fcr die Ausgabe des Entwurfsmusters Memento.\" width=\"385\" height=\"550\" srcset=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-memento-385-550.webp 385w, https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-memento-385-550-210x300.webp 210w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/p>\n<h2>Zusammenfassung<\/h2>\n<p> Das <strong>Memento<\/strong> ist ein Entwurfsmuster, das das Problem der Speicherung und Wiederherstellung des Zustands eines Objekts l\u00f6st, so dass es zu einem fr\u00fcheren Zustand zur\u00fcckkehren kann. Sie wird h\u00e4ufig verwendet, um einen Undo\/Rollback-Mechanismus zu implementieren oder um eine Historie der Objektzust\u00e4nde zu f\u00fchren. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausf\u00fchren kannst. Lade den <a href=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/01\/Memento.zip\">Code Java <strong>Memento <\/strong> hier herunter.<\/a> Wenn du als <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/java-entwickler-senior\/\">Java-Programmierer<\/a> auf der Suche nach Arbeit bist, 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 Stellenausschreibungen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist das Java Memento Entwurfsmuster und wof\u00fcr wird es verwendet? Lies unseren neuen Artikel und lade den Beispielcode herunter.<\/p>\n","protected":false},"author":14,"featured_media":2689,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-3927","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\/3927","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=3927"}],"version-history":[{"count":7,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3927\/revisions"}],"predecessor-version":[{"id":8039,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3927\/revisions\/8039"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/2689"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=3927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=3927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=3927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}