Megosztás a következőn keresztül:


Útmutató: Megfigyelő implementálása

A megfigyelő tervezési mintája megköveteli az értesítéseket regisztráló megfigyelő és egy szolgáltató közötti elosztást, amely figyeli az adatokat, és értesítéseket küld egy vagy több megfigyelőnek. Ez a témakör azt ismerteti, hogyan hozhat létre megfigyelőt. Egy kapcsolódó témakör, a How to: Implement a Provider (Szolgáltató implementálása) című témakör bemutatja, hogyan hozhat létre szolgáltatót.

Megfigyelő létrehozása

  1. Határozza meg a megfigyelőt, amely egy olyan típus, amely megvalósítja a System.IObserver<T> felületet. Az alábbi kód például egy olyan típust TemperatureReporter határoz meg, amely egy konstruktált System.IObserver<T> implementáció, amelynek általános típusargumentuma a Temperaturekövetkező: .

    public class TemperatureReporter : IObserver<Temperature>
    
    Public Class TemperatureReporter : Implements IObserver(Of Temperature)
    
  2. Ha a megfigyelő le tudja állítani az értesítések fogadását, mielőtt a szolgáltató meghívja a megvalósítást IObserver<T>.OnCompleted , határozzon meg egy privát változót, amely a IDisposable szolgáltató IObservable<T>.Subscribe metódusa által visszaadott implementációt fogja tárolni. Meg kell határoznia egy előfizetési módszert is, amely meghívja a szolgáltató metódusát Subscribe , és tárolja a visszaadott IDisposable objektumot. Az alábbi kód például egy elnevezett unsubscriber magánváltozót definiál, és meghatároz egy metódust Subscribe , amely meghívja a szolgáltató metódusát Subscribe , és hozzárendeli a visszaadott objektumot a unsubscriber változóhoz.

    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. Definiáljon egy metódust, amely lehetővé teszi a megfigyelő számára, hogy ne kapjon értesítéseket, mielőtt a szolgáltató meghívja annak IObserver<T>.OnCompleted megvalósítását, ha erre a funkcióra van szükség. Az alábbi példa egy metódust Unsubscribe határoz meg.

    public virtual void Unsubscribe()
    {
       unsubscriber.Dispose();
    }
    
    Public Overridable Sub Unsubscribe()
        unsubscriber.Dispose()
    End Sub
    
  4. Adja meg a felület által IObserver<T> meghatározott három metódus implementációit: IObserver<T>.OnNext, IObserver<T>.OnErrorés IObserver<T>.OnCompleted. A szolgáltatótól és az alkalmazás igényeitől függően a OnErrorOnCompleted módszerek lehetnek csonk implementációk. Vegye figyelembe, hogy a OnError metódus nem kezelheti kivételként az átadott Exception objektumot, és a OnCompleted metódus szabadon meghívhatja a szolgáltató implementációját IDisposable.Dispose . Az alábbi példa az IObserver<T> osztály implementálását TemperatureReporter mutatja be.

    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
    

Példa

Az alábbi példa az osztály teljes forráskódját TemperatureReporter tartalmazza, amely egy hőmérséklet-monitorozási alkalmazás implementációját biztosítja IObserver<T> .

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

Lásd még