{"id":3987,"date":"2024-02-12T16:05:47","date_gmt":"2024-02-12T16:05:47","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=3987"},"modified":"2025-07-07T11:36:34","modified_gmt":"2025-07-07T11:36:34","slug":"java-observer","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-observer\/","title":{"rendered":"Java-Entwurfsmuster (design pattern): Observer"},"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; Observer. 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 Observer?<\/h2>\n<p><strong>Observer<\/strong> ist ein Entwurfsmuster, mit dem wir einen Mechanismus zur Entgegennahme von Nachrichten und zur Benachrichtigung aller interessierten Objekte \u00fcber alle Ereignisse, die bei dem beobachteten Objekt auftreten, definieren k\u00f6nnen. <\/p>\n<h2>Welches Problem wird mit dem Entwurfsmuster Observer gel\u00f6st?<\/h2>\n<p> <strong>Observer <\/strong> ist ein Entwurfsmuster, das das Problem der Verfolgung einer Zustands\u00e4nderung eines Objekts l\u00f6st, so dass alle abh\u00e4ngigen Objekte (Beobachter) automatisch benachrichtigt und aktualisiert werden, wenn eine \u00c4nderung im Objekt auftritt. Dieses Muster erm\u00f6glicht es, schwache Verbindungen zwischen dem Subjekt (dem Objekt, das seinen Zustand \u00e4ndert) und den Beobachtern (den Objekten, die \u00fcber die \u00c4nderung informiert werden m\u00f6chten) herzustellen. Das beobachtete Objekt &#8211; <strong>Publisher<\/strong> geht durch Ereignisse, die f\u00fcr andere Objekte von Interesse sind. Diese Ereignisse treten ein, wenn es seinen Zustand \u00e4ndert oder eine Aktion ausf\u00fchrt. Publisher verf\u00fcgen \u00fcber eine Abonnement-Infrastruktur, die es neuen<strong>Abonnenten<\/strong> erm\u00f6glicht, der Liste beizutreten und bestehenden Abonnenten, die Liste zu verlassen. Wenn ein neues Ereignis eintritt, durchl\u00e4uft der Herausgeber die Abonnentenliste und ruft bei jedem Abonnentenobjekt die in der Abonnentenschnittstelle deklarierte Benachrichtigungsmethode auf. Die Teilnehmerschnittstelle besteht in den meisten F\u00e4llen aus einer einzigen Aktualisierungsmethode. Die Methode kann mehrere Parameter haben, die es dem Herausgeber erm\u00f6glichen, detailliertere Informationen \u00fcber das Ereignis zusammen mit der Aktualisierung zu melden. Bestimmte Abonnenten ergreifen ihre eigenen Ma\u00dfnahmen als Reaktion auf die Mitteilungen des Herausgebers. Alle diese Klassen m\u00fcssen dieselbe Schnittstelle implementieren, so dass der Herausgeber nicht direkt mit bestimmten Klassen verbunden ist. Abonnenten ben\u00f6tigen in der Regel kontextbezogene Informationen, um die Aktualisierung korrekt zu verarbeiten. Der Client erstellt Verleger- und Abonnentenobjekte getrennt und registriert dann Abonnenten f\u00fcr Verlegeraktualisierungen. <\/p>\n<h2>Ein Beispiel f\u00fcr eine Observer-Implementierung in Java.<\/h2>\n<p> Um die praktische Anwendung des <strong>Observer<\/strong>-Entwurfsmusters zu demonstrieren, erstellen wir eine einfache Simulation eines YouTube-Kanals. Hier k\u00f6nnen sich Benutzer (Abonnenten) f\u00fcr Benachrichtigungen \u00fcber neue Videos auf dem Kanal anmelden oder ihr Abonnement k\u00fcndigen. <strong><u>IOdoberatel.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic interface IOdoberatel {\n    void aktualizovat(String sprava);\n}<\/code><\/pre>\n<p> Die Schnittstelle <strong>IOdoberatel<\/strong> definiert die Aktualisierungsmethode, die von bestimmten Abonnenten implementiert wird. Es wird zur Aktualisierung bei neuen Inhalten verwendet. <strong><u>YouTubeUser.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic class YouTubePouzivatel implements IOdoberatel {\n    private String meno;\n\n    public YouTubePouzivatel(String meno) {\n        this.meno = meno;\n    }\n\n    @Override\n    public void aktualizovat(String videoTitul) {\n        System.out.println(meno + &quot; dostal\/a notifik\u00e1ciu o novom videu: &quot; + videoTi-tul);\n    }\n\n    @Override\n    public String toString() {\n        return meno;\n    }\n}\n<\/code> Trieda <strong>YouTubePouzivatel <\/strong>reprezentuje konkr\u00e9tneho pou\u017e\u00edvate\u013ea, ktor\u00fd m\u00f4\u017ee prij\u00edma\u0165 notifik\u00e1cie o nov\u00fdch vide\u00e1ch.<\/pre>\n<p><span style=\"text-decoration: underline;\"><strong>IYoutubeKanal.java<\/strong><\/span><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\npublic interface IYoutubeKanal {\n    void odoberat(IOdoberatel odoberatel);\n    void zrusitOdber(IOdoberatel odoberatel);\n    void upozornitOdoberatelov(String videoTitul);\n}<\/code><\/pre>\n<p> Die Schnittstelle <strong>IYoutubeKanal <\/strong>definiert die Methoden subscribe, deleteSubscriber und notifySubscriber, die ein bestimmter YouTube-Kanal implementieren wird. Sie wird zur Verwaltung der Abonnenten verwendet. <strong><u>YouTubeKanal.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">package designpatterns;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class YouTubeKanal implements IYoutubeKanal {\n    private List&lt;IOdoberatel&gt; odoberatelia = new ArrayList&lt;&gt;();\n    private String nazovKanala;\n\n    public YouTubeKanal(String nazovKanala) {\n        this.nazovKanala = nazovKanala;\n    }\n\n    @Override\n    public void odoberat(IOdoberatel odoberatel) {\n        odoberatelia.add(odoberatel);\n        System.out.println(odoberatel + &quot; odober\u00e1 &quot; + nazovKanala);\n    }\n\n    @Override\n    public void zrusitOdber(IOdoberatel odoberatel) {\n        odoberatelia.remove(odoberatel);\n        System.out.println(odoberatel + &quot; odhl\u00e1sil\/a odber &quot; + nazovKanala);\n    }\n\n    @Override\n    public void upozornitOdoberatelov(String videoTitul) {\n        for(IOdoberatel odoberatel : odoberatelia) {\n            odoberatel.aktualizovat(videoTitul);\n        }\n    }\n\n    public void nahratNoveVideo(String videoTitul) {\n        System.out.println(&quot;Nov\u00e9 video bolo pridan\u00e9: &quot; + videoTitul);\n        upozornitOdoberatelov(videoTitul);\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>YouTubeKanal <\/strong>repr\u00e4sentiert einen bestimmten YouTube-Kanal, der Abonnenten abonnieren und abbestellen kann und sie \u00fcber neue Videos benachrichtigt. <strong><u>Main.java<\/u><\/strong><\/p>\n<pre><code class=\"language-java\" data-line=\"\">import designpatterns.IOdoberatel;\nimport designpatterns.IYoutubeKanal;\nimport designpatterns.YouTubeKanal;\nimport designpatterns.YouTubePouzivatel;\n\npublic class Main {\n    public static void main(String[] args) {\n        \/\/ Vytvorenie YouTube kanalu\n        YouTubeKanal youtubeKanal = new YouTubeKanal(&quot;[Programovanie v Jave]&quot;);\n\n        \/\/ Vytvorenie odoberatelov (subscribers)\n        IOdoberatel odoberatel1 = new YouTubePouzivatel(&quot;Subscriber1&quot;);\n        IOdoberatel odoberatel2 = new YouTubePouzivatel(&quot;Subscriber2&quot;);\n\n        \/\/ Nastavenie odberov YouTube kanala\n        youtubeKanal.odoberat(odoberatel1);\n        youtubeKanal.odoberat(odoberatel2);\n\n        \/\/ Pridanie noveho videa, vsetci odoberatelia dostanu upozornenie\n        youtubeKanal.nahratNoveVideo(&quot;Navrhove vzory v Jave&quot;);\n\n        \/\/ Odoberatel 1 odhlasi odber\n        youtubeKanal.zrusitOdber(odoberatel1);\n\n        \/\/ Pridanie dalsieho videa, notifikaciu dostatne len Odoberatel 2\n        youtubeKanal.nahratNoveVideo(&quot;Java SDK 21&quot;);\n    }\n}<\/code><\/pre>\n<p> Die Klasse <strong>Main<\/strong> simuliert den Betrieb eines einzelnen YouTube-Kanals, auf dem Benutzer (Abonnenten) ein Abonnement abschlie\u00dfen k\u00f6nnen und alle Abonnenten benachrichtigt werden, wenn ein neues Video hinzugef\u00fcgt wird.  Ebenso ist zu sehen, dass der Benutzer nach dem Abmelden vom Abonnement keine Benachrichtigungen \u00fcber neue Inhalte mehr erh\u00e4lt. Die Ausgabe dieses Beispiels ist: &nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2752 size-full\" src=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-observer-750-330.webp\" alt=\"Die Ausgabe des Beispiels f\u00fcr das Entwurfsmuster Observer.\" width=\"750\" height=\"330\" srcset=\"https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-observer-750-330.webp 750w, https:\/\/msgprogramator.sk\/wp-content\/uploads\/2024\/02\/vystup-z-prikladu-observer-750-330-300x132.webp 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/p>\n<h2>Zusammenfassung<\/h2>\n<p> Das <strong>Observer Entwurfsmuster<\/strong> wird in Systemen verwendet, die Ereignisse verarbeiten, z.B. in GUI-Komponenten (Mausklick auf eine Schaltfl\u00e4che), aber sie sind \u00fcberall dort n\u00fctzlich, wo wir flexibel auf eine \u00c4nderung am beobachteten Objekt reagieren wollen. 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\/Observer.zip\">den Java <strong>Observer-Code<\/strong> hier<\/a> herunter. Wenn du auf der Suche nach einem Job sind und ein <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\/\">Mitarbeitervorteile<\/a> und reagiere auf unsere <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/\">aktuellen Stellenausschreibungen<\/a>. &nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist das Java Observer Design Pattern und wof\u00fcr wird es verwendet? Lies unseren neuen Artikel und lade den Beispielcode herunter.<\/p>\n","protected":false},"author":14,"featured_media":2757,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-3987","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\/3987","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=3987"}],"version-history":[{"count":5,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3987\/revisions"}],"predecessor-version":[{"id":8041,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/3987\/revisions\/8041"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/2757"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=3987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=3987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=3987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}