Gör så här: Implementera en observatör
Mönstret för observatörsdesign kräver en uppdelning mellan en observatör som registrerar sig för meddelanden och en leverantör som övervakar data och skickar meddelanden till en eller flera observatörer. I det här avsnittet beskrivs hur du skapar en observatör. Ett relaterat ämne, Så här: Implementera en provider, beskrivs hur du skapar en provider.
Skapa en övervakare
Definiera observatören, som är en typ som implementerar System.IObserver<T> gränssnittet. Följande kod definierar till exempel en typ med namnet
TemperatureReporter
som är en konstruerad System.IObserver<T> implementering med ett allmänt typargument avTemperature
.public class TemperatureReporter : IObserver<Temperature>
Public Class TemperatureReporter : Implements IObserver(Of Temperature)
Om övervakaren kan sluta ta emot meddelanden innan providern anropar implementeringen IObserver<T>.OnCompleted definierar du en privat variabel som ska innehålla implementeringen IDisposable som returneras av leverantörens IObservable<T>.Subscribe metod. Du bör också definiera en prenumerationsmetod som anropar providerns Subscribe metod och lagrar det returnerade IDisposable objektet. Följande kod definierar till exempel en privat variabel med namnet
unsubscriber
och definierar enSubscribe
metod som anropar providerns Subscribe metod och tilldelar det returnerade objektet till variabelnunsubscriber
.public class TemperatureReporter : IObserver<Temperature> { private IDisposable unsubscriber; private bool first = true; private Temperature last; public virtual void Subscribe(IObservable<Temperature> provider) { unsubscriber = provider.Subscribe(this); }
Public Class TemperatureReporter : Implements IObserver(Of Temperature) Private unsubscriber As IDisposable Private first As Boolean = True Private last As Temperature Public Overridable Sub Subscribe(ByVal provider As IObservable(Of Temperature)) unsubscriber = provider.Subscribe(Me) End Sub
Definiera en metod som gör det möjligt för övervakaren att sluta ta emot meddelanden innan providern anropar implementeringen IObserver<T>.OnCompleted , om den här funktionen krävs. I följande exempel definieras en
Unsubscribe
metod.public virtual void Unsubscribe() { unsubscriber.Dispose(); }
Public Overridable Sub Unsubscribe() unsubscriber.Dispose() End Sub
Ange implementeringar av de tre metoder som definierats av IObserver<T> gränssnittet: IObserver<T>.OnNext, IObserver<T>.OnErroroch IObserver<T>.OnCompleted. Beroende på providern och programmets OnError behov kan metoderna och OnCompleted vara stub-implementeringar. Observera att OnError metoden inte ska hantera det skickade Exception objektet som ett undantag, och OnCompleted metoden kan anropa providerns IDisposable.Dispose implementering. I följande exempel visas implementeringen IObserver<T> av
TemperatureReporter
klassen.public virtual void OnCompleted() { Console.WriteLine("Additional temperature data will not be transmitted."); } public virtual void OnError(Exception error) { // Do nothing. } public virtual void OnNext(Temperature value) { Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date); if (first) { last = value; first = false; } else { Console.WriteLine(" Change: {0}° in {1:g}", value.Degrees - last.Degrees, value.Date.ToUniversalTime() - last.Date.ToUniversalTime()); } }
Public Overridable Sub OnCompleted() Implements System.IObserver(Of Temperature).OnCompleted Console.WriteLine("Additional temperature data will not be transmitted.") End Sub Public Overridable Sub OnError(ByVal [error] As System.Exception) Implements System.IObserver(Of Temperature).OnError ' Do nothing. End Sub Public Overridable Sub OnNext(ByVal value As Temperature) Implements System.IObserver(Of Temperature).OnNext Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date) If first Then last = value first = False Else Console.WriteLine(" Change: {0}° in {1:g}", value.Degrees - last.Degrees, value.Date.ToUniversalTime - last.Date.ToUniversalTime) End If End Sub
Exempel
Följande exempel innehåller den fullständiga källkoden TemperatureReporter
för klassen, som tillhandahåller implementeringen IObserver<T> för ett program för temperaturövervakning.
public class TemperatureReporter : IObserver<Temperature>
{
private IDisposable unsubscriber;
private bool first = true;
private Temperature last;
public virtual void Subscribe(IObservable<Temperature> provider)
{
unsubscriber = provider.Subscribe(this);
}
public virtual void Unsubscribe()
{
unsubscriber.Dispose();
}
public virtual void OnCompleted()
{
Console.WriteLine("Additional temperature data will not be transmitted.");
}
public virtual void OnError(Exception error)
{
// Do nothing.
}
public virtual void OnNext(Temperature value)
{
Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date);
if (first)
{
last = value;
first = false;
}
else
{
Console.WriteLine(" Change: {0}° in {1:g}", value.Degrees - last.Degrees,
value.Date.ToUniversalTime() - last.Date.ToUniversalTime());
}
}
}
Public Class TemperatureReporter : Implements IObserver(Of Temperature)
Private unsubscriber As IDisposable
Private first As Boolean = True
Private last As Temperature
Public Overridable Sub Subscribe(ByVal provider As IObservable(Of Temperature))
unsubscriber = provider.Subscribe(Me)
End Sub
Public Overridable Sub Unsubscribe()
unsubscriber.Dispose()
End Sub
Public Overridable Sub OnCompleted() Implements System.IObserver(Of Temperature).OnCompleted
Console.WriteLine("Additional temperature data will not be transmitted.")
End Sub
Public Overridable Sub OnError(ByVal [error] As System.Exception) Implements System.IObserver(Of Temperature).OnError
' Do nothing.
End Sub
Public Overridable Sub OnNext(ByVal value As Temperature) Implements System.IObserver(Of Temperature).OnNext
Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date)
If first Then
last = value
first = False
Else
Console.WriteLine(" Change: {0}° in {1:g}", value.Degrees - last.Degrees,
value.Date.ToUniversalTime - last.Date.ToUniversalTime)
End If
End Sub
End Class