<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Observer Pattern - wie funktioniert das eigentlich?]]></title><description><![CDATA[<p>Observer Pattern - wie funktioniert das eigentlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155130/observer-pattern-wie-funktioniert-das-eigentlich</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 08:12:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155130.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Aug 2006 21:59:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Wed, 02 Aug 2006 21:59:45 GMT]]></title><description><![CDATA[<p>Observer Pattern - wie funktioniert das eigentlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109576</guid><dc:creator><![CDATA[hellweger]]></dc:creator><pubDate>Wed, 02 Aug 2006 21:59:45 GMT</pubDate></item><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Sat, 05 Aug 2006 18:16:04 GMT]]></title><description><![CDATA[<p>Einfaches Beispiel (basiert auf vereinfachtem Code von Gamma <a href="http://et.al" rel="nofollow">et.al</a>. <a href="http://www.cs.clemson.edu/~malloy/courses/patterns/observerEx.html" rel="nofollow">http://www.cs.clemson.edu/~malloy/courses/patterns/observerEx.html</a>):</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;deque&gt;
#include &lt;ctime&gt;
#include &lt;cstring&gt;
#include &lt;cstdlib&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;

using namespace std ;

/************************** Subjekt und Beobachter ***********************************/

class Subject;

struct Observer
{
  virtual void Update( Subject* ) = 0;
};

class Subject
{
public:
  void Attach( Observer* );
  void Detach( Observer* );
  void Notify();
private:
  deque&lt;Observer*&gt; observers_;
};

void Subject::Attach( Observer* o ) //MeldeAn
{
  observers_.push_back(o);
}

void Subject::Detach( Observer* o ) //MeldeAb
{
  size_t n = observers_.size();
  size_t i;

  for( i = 0; i &lt; n; ++i )
  {
    if(observers_[i] == o)
      break;
  }

  if(i &lt; n)
    observers_.erase( observers_.begin() + i );
}

void Subject::Notify() //Benachrichtige
{
  size_t n = observers_.size();
  for( size_t i = 0; i &lt; n; ++i )
    observers_[i]-&gt;Update(this);
}

/************************** Konkretes Subjekt ***********************************/

class Timer : public Subject
{
public:
  Timer() { _strtime_s( buffer_ ); };
  std::string Timer::GetTime()const {return std::string(buffer_);}
  void Tick();
private:
  char buffer_[128];
};

void Timer::Tick()
{
  _tzset();
  _strtime_s( buffer_ );
  Notify();
}

/************************** Konkreter Beobachter ***********************************/

class Clock: public Observer
{
public:
  Clock( std::string name, Timer* );
  ~Clock();
  void Update( Subject* );
  std::string getName() const {return name_;}
  Timer* getSubject() const {return subject_;}
private:
  std::string name_;
  Timer* subject_;
};

Clock::Clock( std::string name, Timer* s ) : subject_(s)
{
  name_ = name;
  subject_-&gt;Attach(this);
}

Clock::~Clock () { subject_-&gt;Detach(this); }

void Clock::Update( Subject* s ) //Aktualisiere
{
  if( s == subject_ )
    cout &lt;&lt; getName() &lt;&lt; &quot; zeigt &quot; &lt;&lt; subject_-&gt;GetTime() &lt;&lt; endl;
}

/************************** Hauptprogramm ***********************************/

int main()
{
  Timer t;                                  //Subjekt

  const int N = 100;
  char buffer[20];
  Clock* pC[N];

  for(int i=0; i&lt;N; ++i)
  {
    _itoa_s( i, buffer, 10 );
    pC[i] = new Clock( buffer, &amp;t );        //Observer
  }

  t.Tick();
  wait();

  for(int i=0; i&lt;N/2; ++i)
  {
    pC[i]-&gt;getSubject()-&gt;Detach(pC[i]);     //Einige Observer melden sich ab
  }

  t.Tick();
  wait();

  for(int i=0; i&lt;N; ++i)
  {
    delete pC[i];
  }

  return 0;
}
</code></pre>
<p>Ein gutes Beispiel ist auch ein MailServer und entsprechene EmailKonten:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;deque&gt;
#include &lt;string&gt;
#include &lt;ostream&gt;

/************************** Subjekt und Beobachter ***********************************/

class Subject;

struct Observer
{
  virtual void update( Subject* ) = 0;
};

class Subject
{
public:
  void attach( Observer* );
  void detach( Observer* );
  void notify();
private:
  std::deque&lt;Observer*&gt; observers_;
};

void Subject::attach( Observer* o ) //MeldeAn
{
  observers_.push_back(o);
}

void Subject::detach( Observer* o ) //MeldeAb
{
  size_t n = observers_.size();
  size_t i;

  for( i = 0; i &lt; n; ++i )
  {
    if(observers_[i] == o)
      break;
  }

  if(i &lt; n)
    observers_.erase( observers_.begin() + i );
}

void Subject::notify() //Benachrichtige
{
  size_t n = observers_.size();
  for( size_t i = 0; i &lt; n; ++i )
    observers_[i]-&gt;update(this);
}

/************************** Konkretes Subjekt ***********************************/

class MailServer : public Subject
{
public:
  MailServer( std::string name ): name_(name){}
  void neuerNewsletter() { notify(); }
  std::string getName()  const {return name_;}
private:
  const std::string name_;
};

/************************** Konkreter Beobachter ***********************************/

class EmailKonto: public Observer
{
public:
  EmailKonto( std::string name, MailServer* );
  ~EmailKonto();
  void update( Subject* );
  std::string getName()    const {return name_;}
  MailServer* getSubject() const {return subject_;}
private:
  const std::string name_;
  MailServer* subject_;
};

EmailKonto::EmailKonto( std::string name, MailServer* s ) : name_(name), subject_(s)
{
  subject_-&gt;attach(this);
}

EmailKonto::~EmailKonto () { subject_-&gt;detach(this); }

void EmailKonto::update( Subject* s ) //Aktualisiere
{
  if( s == subject_ )
      std::cout &lt;&lt; &quot;Hallo Herr Nr. &quot; &lt;&lt; getName() &lt;&lt; &quot;, ein neuer Newsletter von &quot;
      &lt;&lt; subject_-&gt;getName()&lt;&lt; &quot; ist erschienen.&quot; &lt;&lt; std::endl;
}

/************************** Hauptprogramm ***********************************/

int main()
{
  MailServer s(&quot;HenkesSoft3000&quot;);           //Subjekt &quot;MailServer&quot;

  const int N = 5;
  char buffer[10];

  EmailKonto* pMK[N];

  for(int i=0; i&lt;N; ++i)
  {
    _itoa_s( i, buffer, 10 );
    pMK[i] = new EmailKonto( buffer, &amp;s );   //Mailkonten melden sich an
  }

  s.neuerNewsletter();
  wait();

  for(int i=0; i&lt;(N-2); ++i)
  {
    pMK[i]-&gt;getSubject()-&gt;detach(pMK[i]);     //Zwei Mailkonten melden sich ab
  }

  s.neuerNewsletter();
  wait();

  for(int i=0; i&lt;N; ++i)
  {
    delete pMK[i];
  }

  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1109577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109577</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Sat, 05 Aug 2006 18:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Wed, 02 Aug 2006 22:20:00 GMT]]></title><description><![CDATA[<p>Hier ist auch noch ein gutes Beispiel:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-147713-and-highlight-is-%2Aobserver%2A.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-147713-and-highlight-is-*observer*.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109582</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 02 Aug 2006 22:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Sat, 03 May 2008 18:45:23 GMT]]></title><description><![CDATA[<p>c780t</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502758</guid><dc:creator><![CDATA[now390@gmail.com]]></dc:creator><pubDate>Sat, 03 May 2008 18:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Sat, 03 May 2008 19:12:16 GMT]]></title><description><![CDATA[<p>Eine gute Erklärung bietet auch unser Artikel zu Design Patterns:<br />
<a href="http://magazin.c-plusplus.net/artikel/Einf%FChrung%20in%20Design%20Patterns" rel="nofollow">http://magazin.c-plusplus.net/artikel/Einf%FChrung%20in%20Design%20Patterns</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502765</guid><dc:creator><![CDATA[mikey]]></dc:creator><pubDate>Sat, 03 May 2008 19:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Sat, 03 May 2008 19:21:42 GMT]]></title><description><![CDATA[<p>ok ohne mir annährend alles durchzulesen</p>
<p>die ganzen actionlistener, eventlistener usw in java sind im grunde ja einfach observer patterns oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502770</guid><dc:creator><![CDATA[Vevusio]]></dc:creator><pubDate>Sat, 03 May 2008 19:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to Observer Pattern - wie funktioniert das eigentlich? on Mon, 29 Dec 2008 18:09:58 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hatte mal Observer Pattern in einer anderen Programmiersprache implementiert. Es funktioniert bei mir ungefähr so...</p>
<p>Dispatcher ist ein getrenntes Programm, das auf einem Webserver installiert ist. Dispatcher führt eine Tabelle mit Clients und Topics. Sobald sich ein neuer Client anmeldet wird dieser in die Tabelle eingetragen. Danach sagt der Client welche Topics von Interesse sind, der Dispatcher trägt es in die Tabelle ein. Die Tabelle sieht ungefähr so aus:</p>
<p>Topic1 Topic2 Topic3<br />
Client1 0 1 0<br />
Client2 1 1 1<br />
Client3 1 0 1</p>
<p>Es bedeutet dass Client1 nur Topic2 emfangen will, Client2 alle drei Topics und Client3 nur Topic1 und Topic3.</p>
<p>Sobald der Dispatcher eine Nachricht von einem Client empfangt (Topic wird in der Nachricht mitgeteilt) schaut der Dispatcher in der Tabelle nach, welche Clients sich nun für diese Nachricht interessieren und schickt diese Nachricht nacheinander zu den Clients ab.</p>
<p>Und nun wollte ich den Dispatcher auf C++ Basis umprogrammieren, weil die Exe dann direkt ohne weiteres auf dem Server gestartet werden kann. In LabVIEW sollte man zuerst eine Runtime installieren.</p>
<p>Deshalb soll das Dispatcher-Prog komplett getrennt von Clients programmiert werden. Die Kommunikation soll ausschliesslich über TCP/IP laufen. Gibt es dazu irgendwelche Beispiele?</p>
<p>Mfg, labviewer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636933</guid><dc:creator><![CDATA[labviewer]]></dc:creator><pubDate>Mon, 29 Dec 2008 18:09:58 GMT</pubDate></item></channel></rss>