<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Observer-Entwurfsmuster_%28Observer_Pattern%29</id>
	<title>Observer-Entwurfsmuster (Observer Pattern) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Observer-Entwurfsmuster_%28Observer_Pattern%29"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Observer-Entwurfsmuster_(Observer_Pattern)&amp;action=history"/>
	<updated>2026-05-09T11:16:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Observer-Entwurfsmuster_(Observer_Pattern)&amp;diff=82&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= Observer-Entwurfsmuster (Observer Pattern) =  Das &#039;&#039;&#039;Observer-Entwurfsmuster&#039;&#039;&#039; (deutsch: &#039;&#039;&#039;Beobachter-Muster&#039;&#039;&#039;) ist ein &#039;&#039;&#039;Verhaltensmuster&#039;&#039;&#039;, das verwendet wird, um eine &#039;&#039;&#039;eins-zu-viele-Abhängigkeit&#039;&#039;&#039; zwischen Objekten zu definieren.   Wenn sich der Zustand eines Objekts (des &#039;&#039;&#039;Subjects&#039;&#039;&#039;) ändert, werden automatisch alle abhängigen Objekte (die &#039;&#039;&#039;Observer&#039;&#039;&#039;) benachrichtigt und aktualisiert.  Das Muster wird häufig für &#039;&#039;&#039;Ereignisbenachri…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Observer-Entwurfsmuster_(Observer_Pattern)&amp;diff=82&amp;oldid=prev"/>
		<updated>2025-10-30T11:41:42Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= Observer-Entwurfsmuster (Observer Pattern) =  Das &amp;#039;&amp;#039;&amp;#039;Observer-Entwurfsmuster&amp;#039;&amp;#039;&amp;#039; (deutsch: &amp;#039;&amp;#039;&amp;#039;Beobachter-Muster&amp;#039;&amp;#039;&amp;#039;) ist ein &amp;#039;&amp;#039;&amp;#039;Verhaltensmuster&amp;#039;&amp;#039;&amp;#039;, das verwendet wird, um eine &amp;#039;&amp;#039;&amp;#039;eins-zu-viele-Abhängigkeit&amp;#039;&amp;#039;&amp;#039; zwischen Objekten zu definieren.   Wenn sich der Zustand eines Objekts (des &amp;#039;&amp;#039;&amp;#039;Subjects&amp;#039;&amp;#039;&amp;#039;) ändert, werden automatisch alle abhängigen Objekte (die &amp;#039;&amp;#039;&amp;#039;Observer&amp;#039;&amp;#039;&amp;#039;) benachrichtigt und aktualisiert.  Das Muster wird häufig für &amp;#039;&amp;#039;&amp;#039;Ereignisbenachri…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Observer-Entwurfsmuster (Observer Pattern) =&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Observer-Entwurfsmuster&amp;#039;&amp;#039;&amp;#039; (deutsch: &amp;#039;&amp;#039;&amp;#039;Beobachter-Muster&amp;#039;&amp;#039;&amp;#039;) ist ein &amp;#039;&amp;#039;&amp;#039;Verhaltensmuster&amp;#039;&amp;#039;&amp;#039;, das verwendet wird, um eine &amp;#039;&amp;#039;&amp;#039;eins-zu-viele-Abhängigkeit&amp;#039;&amp;#039;&amp;#039; zwischen Objekten zu definieren.  &lt;br /&gt;
Wenn sich der Zustand eines Objekts (des &amp;#039;&amp;#039;&amp;#039;Subjects&amp;#039;&amp;#039;&amp;#039;) ändert, werden automatisch alle abhängigen Objekte (die &amp;#039;&amp;#039;&amp;#039;Observer&amp;#039;&amp;#039;&amp;#039;) benachrichtigt und aktualisiert.&lt;br /&gt;
&lt;br /&gt;
Das Muster wird häufig für &amp;#039;&amp;#039;&amp;#039;Ereignisbenachrichtigungen&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;GUI-Updates&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Echtzeitkommunikation&amp;#039;&amp;#039;&amp;#039; eingesetzt.&lt;br /&gt;
&lt;br /&gt;
== Grundidee ==&lt;br /&gt;
&lt;br /&gt;
Ein Objekt („Subject“) verwaltet eine Liste von Beobachtern („Observer“) und informiert sie, sobald sich sein Zustand ändert.  &lt;br /&gt;
Dadurch wird eine lose Kopplung zwischen Sender und Empfänger erreicht – das Subject kennt seine Observer nicht im Detail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-------------------+        +-------------------+&lt;br /&gt;
|     Subject       |&amp;lt;------&amp;gt;|     Observer      |&lt;br /&gt;
|-------------------|        |-------------------|&lt;br /&gt;
| + attach()        |        | + update()        |&lt;br /&gt;
| + detach()        |        |                   |&lt;br /&gt;
| + notify()        |        +-------------------+&lt;br /&gt;
+-------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Komponente !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Subject&amp;#039;&amp;#039;&amp;#039; || Verwaltet eine Liste von Observern und benachrichtigt sie bei Zustandsänderungen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Observer&amp;#039;&amp;#039;&amp;#039; || Definiert ein Interface zur Aktualisierung bei Benachrichtigung.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ConcreteSubject&amp;#039;&amp;#039;&amp;#039; || Konkrete Implementierung des Subjects; speichert den Zustand.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ConcreteObserver&amp;#039;&amp;#039;&amp;#039; || Beobachtet ein Subject und reagiert auf Benachrichtigungen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiel (C++) ==&lt;br /&gt;
Ein einfaches Beispiel für das Observer-Muster in C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Observer {&lt;br /&gt;
public:&lt;br /&gt;
    virtual void update(const std::string&amp;amp; message) = 0;&lt;br /&gt;
    virtual ~Observer() = default;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Subject {&lt;br /&gt;
    std::vector&amp;lt;Observer*&amp;gt; observers;&lt;br /&gt;
public:&lt;br /&gt;
    void attach(Observer* obs) {&lt;br /&gt;
        observers.push_back(obs);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void detach(Observer* obs) {&lt;br /&gt;
        observers.erase(std::remove(observers.begin(), observers.end(), obs), observers.end());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void notify(const std::string&amp;amp; message) {&lt;br /&gt;
        for (auto* obs : observers)&lt;br /&gt;
            obs-&amp;gt;update(message);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class ConcreteObserver : public Observer {&lt;br /&gt;
    std::string name;&lt;br /&gt;
public:&lt;br /&gt;
    explicit ConcreteObserver(std::string n) : name(std::move(n)) {}&lt;br /&gt;
    void update(const std::string&amp;amp; message) override {&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &amp;quot; erhielt Nachricht: &amp;quot; &amp;lt;&amp;lt; message &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Subject newsStation;&lt;br /&gt;
&lt;br /&gt;
    ConcreteObserver alice(&amp;quot;Alice&amp;quot;);&lt;br /&gt;
    ConcreteObserver bob(&amp;quot;Bob&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    newsStation.attach(&amp;amp;alice);&lt;br /&gt;
    newsStation.attach(&amp;amp;bob);&lt;br /&gt;
&lt;br /&gt;
    newsStation.notify(&amp;quot;Neue Nachricht: Design Patterns erklärt!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    newsStation.detach(&amp;amp;bob);&lt;br /&gt;
    newsStation.notify(&amp;quot;Zweite Nachricht: Nur Alice wird benachrichtigt.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erklärung ==&lt;br /&gt;
In diesem Beispiel:&lt;br /&gt;
* Das &amp;lt;code&amp;gt;Subject&amp;lt;/code&amp;gt; (NewsStation) hält eine Liste von Beobachtern.&lt;br /&gt;
* Bei einer Änderung ruft es &amp;lt;code&amp;gt;notify()&amp;lt;/code&amp;gt; auf.&lt;br /&gt;
* Jeder &amp;lt;code&amp;gt;Observer&amp;lt;/code&amp;gt; wird mit &amp;lt;code&amp;gt;update()&amp;lt;/code&amp;gt; benachrichtigt.&lt;br /&gt;
&lt;br /&gt;
So bleibt das System flexibel: Neue Beobachter können leicht hinzugefügt oder entfernt werden, ohne das Subject zu verändern.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
* Lose Kopplung zwischen Sender (Subject) und Empfänger (Observer)  &lt;br /&gt;
* Beliebig viele Empfänger möglich  &lt;br /&gt;
* Dynamisches An- und Abmelden der Beobachter  &lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
* Mögliche Performanceprobleme bei vielen Beobachtern  &lt;br /&gt;
* Reihenfolge und Zeitpunkte der Benachrichtigungen sind nicht garantiert  &lt;br /&gt;
* Kann zu unerwarteten Nebenwirkungen führen, wenn Beobachter ihrerseits wieder Benachrichtigungen auslösen  &lt;br /&gt;
&lt;br /&gt;
== Typische Anwendungsfälle ==&lt;br /&gt;
* GUI-Systeme (z. B. Button → Listener)&lt;br /&gt;
* Event-Systeme (z. B. Message Bus, Signals/Slots)&lt;br /&gt;
* Datenbindung in MVVM-Architekturen&lt;br /&gt;
* Echtzeitbenachrichtigung (z. B. Wetterstation, Börsenticker)&lt;br /&gt;
&lt;br /&gt;
== Varianten ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Push-Modell&amp;#039;&amp;#039;&amp;#039;: Das Subject sendet alle relevanten Daten mit der Benachrichtigung.  &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pull-Modell&amp;#039;&amp;#039;&amp;#039;: Der Observer ruft die benötigten Daten beim Subject selbst ab.&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit ähnlichen Mustern ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Muster !! Vergleich&lt;br /&gt;
|-&lt;br /&gt;
| [[Mediator-Entwurfsmuster]] || Koordiniert mehrere Objekte zentral, anstatt direkte Benachrichtigungen zu senden.&lt;br /&gt;
|-&lt;br /&gt;
| [[Publisher-Subscriber-Muster]] || Ähnlich, aber häufig über einen Message-Bus oder Event-Queue realisiert.&lt;br /&gt;
|-&lt;br /&gt;
| [[Reactor-Entwurfsmuster]] || Ereignisgesteuert, aber auf System-Ebene (z. B. Socket-Ereignisse) statt auf Objektebene.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Publisher-Subscriber-Muster]]&lt;br /&gt;
* [[Mediator-Entwurfsmuster]]&lt;br /&gt;
* [[Reactor-Entwurfsmuster]]&lt;br /&gt;
* [[Event-Driven Architecture]]&lt;br /&gt;
* [[Entwurfsmuster (Softwareentwicklung)]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* Erich Gamma et al.: *Design Patterns – Elements of Reusable Object-Oriented Software* (GoF, 1994)  &lt;br /&gt;
* [https://en.wikipedia.org/wiki/Observer_pattern Wikipedia: Observer Pattern]  &lt;br /&gt;
* [https://refactoring.guru/design-patterns/observer Refactoring.Guru: Observer Pattern]&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>