Tipps und Tricks rund um .NET und Visual Studio

Framework Class Library Observer in .NET 4
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Um Mehrgleisigkeiten bei der Implementierung von Benachrichtigungsmechanismen zu verhindern, wurden zwei Interfaces für die Realisierung des Entwurfsmusters „Oberserver“ eingeführt: IObserver und IObservable. Dem Namen zur Folge wird Ersteres von Klassen implementiert, deren Objekte andere Objekte überwachen , also auf Veränderungen in diesen Objekten reagieren sollen. IObservable wird hingegen von Klassen implementiert, deren Objekte überwacht werden sollen. Die Informationen, welche Klassen zwischen Implementierungen dieser Interfaces ausgetauscht werden, sind dabei vom Typ des angegebenen Typparameters abhängig. Die Kommunikation zwischen Observable und Observer funktioniert nach dem Publish/Subscribe-Prinzip: Der Observer meldet sich beim Observable an und dieser benachrichtigt den Observer bei Zustandsänderungen. Somit stellt der Einsatz dieses Musters eine Alternative zum Einsatz von Events dar. Als vollständiger Ersatz zu Events sei es, dem BCL-Produktteam zur Folge, jedoch nicht gedacht.

Das folgende Listing zeigt eine Klasse, die das Interface IObserver und somit deren Methoden OnCompleted, OnError und OnNext implementiert. OnNext wird von den verbundenen Observables aufgerufen, wenn sich eine (die nächste) Zustandsänderung ergibt; OnCompleted, wenn er seine Arbeit beendet hat und OnError, wenn er auf einen Fehler gestoßen ist.

class RouletteDisplay : IObserver
{
public void OnNext(RouletteInfo value)
    {
Console.WriteLine("Current Number: " + value.CurrentNumber);
    }

public void OnCompleted()
    {
Console.WriteLine("Have a nice night ...");
    }

public void OnError(Exception error)
    {
Console.WriteLine(error.Message);
    }
}  

Ein Beispiel für die Nutzung des Interfaces IObservable findet sich im nächsten Listing. Die hier gezeigte Klasse implementiert das Interface IObservable und somit auch die Methode Subscribe, die Observern die Möglichkeit gibt, sich zu registrieren, um in den Genuss von Änderungshinweisen zu kommen. Die Implementierung dieser Methode legt dazu den übergebenen Observer in einer List ab. Die restlichen Methoden, die nicht durch das realisierte Interface vorgegeben wurden, führen zur Benachrichtigung der registrierten Observer. Im Zuge dessen werden deren Methoden OnNext, OnCompleted bzw. OnError aufgerufen.

class RouletteTable : IObservable
{
List> observers = new List>();
public IDisposable Subscribe(IObserver observer)
    {
observers.Add(observer);
return observer as IDisposable;
    }
public void Play()
    {
Random r;
int number;

r = new Random();
System.Threading.Thread.Sleep(1000);
number = r.Next(37);

foreach (var o in observers)
        {
o.OnNext(new RouletteInfo() { CurrentNumber = number });
        }
    }
public void LetsGoHome()
    {
foreach (var o in observers)
        {
o.OnCompleted();
        }
    }
public void RunAmok()
    {
foreach (var o in observers)
        {
o.OnError(new Exception("Table broken ..."));
        }
    }
}  

Das Zusammenspiel zwischen Observer und Observables wird mit dem nächsten Listing demonstriert. Hier wird ein RouletteTable (Implementierung von IObservable) sowie ein RouletteDisplay (Implementierung von IObserver) instanziiert sowie der Display beim Table mittels Subscribe registriert. Anschließend werden einige Methoden des Tables aufgerufen. Diese Methoden führen zur Benachrichtigung der registrierten Observers und somit im betrachteten Fall zur Benachrichtigung des Displays.

static void ObserverSample()
{
RouletteTable table;
RouletteDisplay display;

table = new RouletteTable();
display = new RouletteDisplay();
table.Subscribe(display);

table.Play();
table.Play();
table.Play();

table.LetsGoHome();
table.RunAmok();

}  

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer arbeiten bei www.IT-Visions.de als Softwarearchitekten, Berater und Trainer für .NET-Technologien. Dabei unterstützen sie zahlreiche Unternehmen beim Einsatz von .NET und entwickeln selbst in größeren Projekten. Sie haben zahlreiche Fachbücher geschrieben und gehören seit vielen Jahren zu den Hauptsprechern auf der BASTA!. Manfred Steyer ist zudem für den Fachbereich „Software Engineering“ der Studienrichtung „IT und Wirtschaftsinformatik“ an der FH CAMPUS 02 in Graz verantwortlich. Dr. Holger Schwichtenberg unterrichtet in Lehraufträgen an den Fachhochschulen Münster und Graz.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -