ProfilWeblogVokabelnSpielchenQuizBücherwurm gRayman.de

Kategorien

Style

Anzeigen

Alle Einnahmen von den folgenden Anzeigen werden an die Deutsche Krebshilfe gespendet.

RSS 0.91

06. Oktober 2003

/cplusplus
Bag  

Wenn ich das ->Observer Pattern in C++ implementieren möchte, brauche ich einen Container, in dem das Subjekt die Pointer auf die Observer verwaltet. Auf diesen Container habe ich folgende Anforderungen:

  • Einfügen und Rausnehmen der Elemente soll schnell sein
  • Da ein Observer sich während einer Nachricht vernichten kann, sollte das Rausnehmen aus dem Container auch während einer Iteration möglich sein
  • Ein Observer kann selbst Subject sein, und so kann es passieren, dass A an B sendet, B an C und C wieder an A. Damit sollte der Container klarkommen.
  • Unbehandelte Exceptions während der Iteration dürfen die Iteration abbrechen, den Container aber nicht in einen ungültigen Zustand versetzen

Hier eine einfache Lösung. Bag ist ein Contaier, das während der Iteration modifiziert werden kann. Herausgenommene Elemente bekommen garantiert keine Nachrichten mehr. Reihenfolge, in der die Iteration stattfindet ist nicht deffiniert.

Obwohl man in dem Container nicht nach den Elementen suchen kann, passiert das Einfügen und Rausnehmen der Elemente in konstanter Zeit. Jedes Eingefügte Element bekommt nämlich ein „Abo“ das seine Position in dem Container bestimmt. Um aus dem Container herausgenommen zu werden, muss das „Abo“ abbestelt werden. Ein Element könnte auch mehrfach in einem Bag vorhanden sein, dann würde es jede Nachricht mehrfach bekommen.

Die Quelltexte kann man hier downloaden. Um Bag zu benutzen, sind nur die Dateien bag.cpp und bag.h nötig. Die anderen Quelltexte beinhalten die gebraucheten Unit-Tests. Um die kompilieren zu können, braucht man das Testframework ->CppUnit

Die Quelltexte sind Open Source (BSD-Lizenz)

0 Kommentar(e) permalink

      Impressum:  Gregor Raýman · Auf dem Kirchbüchel 3 · D-53127 Bonn Kontakt: webmaster@grayman.de         Valid HTML 4.01! Valid HTML 4.01! .