Dela via


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

  1. 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 av Temperature.

    public class TemperatureReporter : IObserver<Temperature>
    
    Public Class TemperatureReporter : Implements IObserver(Of Temperature)
    
  2. 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 en Subscribe metod som anropar providerns Subscribe metod och tilldelar det returnerade objektet till variabeln unsubscriber .

    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
    
  3. 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
    
  4. 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

Se även