Τι Είναι το Observer Pattern;

Φαντάσου ότι έχεις έναν φίλο που είναι πολύ καλός στο να παρακολουθεί τις ειδήσεις. Κάθε φορά που συμβαίνει κάτι νέο, όπως αν βρέχει ή αν υπάρχει κάποια νέα ταινία στον κινηματογράφο, ο φίλος σου θέλει να το μάθει αμέσως.

Το Observer Pattern είναι σαν αυτό: Είναι ένας τρόπος για να έχεις έναν φίλο (ή περισσότερους) που παρακολουθούν κάτι και τους ενημερώνεις όταν συμβαίνει κάτι νέο.
Πώς Λειτουργεί;Έχεις μια Πηγή Νέων (Subject):
Αυτή είναι η πηγή που αλλάζει ή έχει νέες πληροφορίες. Σκέψου ότι είναι το δελτίο καιρού ή το κανάλι ταινιών.

Έχεις Φίλους (Observers):
Αυτοί είναι οι φίλοι που θέλουν να μάθουν όταν κάτι καινούργιο συμβαίνει.

Ενημέρωση Φίλων:
Όταν η πηγή νέων αλλάξει κάτι, όλοι οι φίλοι (οι παρατηρητές) ενημερώνονται για την αλλαγή.

Παράδειγμα στην C#

Ας δούμε πώς να χρησιμοποιήσεις το Observer Pattern στην C# με ένα απλό παράδειγμα.

Δημιουργία του Παρατηρητή (Observer):

using System;
using System.Collections.Generic;

// Κλάση που αντιπροσωπεύει την πηγή νέων
public class WeatherStation
{
    private List<IWeatherObserver> observers = new List<IWeatherObserver>();
    private string weather;

    // Μέθοδος για να προσθέσουμε έναν παρατηρητή
    public void RegisterObserver(IWeatherObserver observer)
    {
        observers.Add(observer);
    }

    // Μέθοδος για να αφαιρέσουμε έναν παρατηρητή
    public void UnregisterObserver(IWeatherObserver observer)
    {
        observers.Remove(observer);
    }

    // Μέθοδος για να ενημερώσουμε όλους τους παρατηρητές
    private void NotifyObservers()
    {
        foreach (var observer in observers)
        {
            observer.Update(weather);
        }
    }

    // Μέθοδος για να αλλάξουμε τον καιρό
    public void SetWeather(string newWeather)
    {
        weather = newWeather;
        NotifyObservers();
    }
}

// Διεπαφή για τον παρατηρητή
public interface IWeatherObserver
{
    void Update(string weather);
}

// Κλάση που υλοποιεί τον παρατηρητή
public class WeatherDisplay : IWeatherObserver
{
    private string weather;

    public void Update(string weather)
    {
        this.weather = weather;
        Console.WriteLine("Ο καιρός είναι τώρα: " + weather);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Δημιουργούμε την πηγή νέων καιρού
        WeatherStation weatherStation = new WeatherStation();

        // Δημιουργούμε παρατηρητές
        WeatherDisplay display1 = new WeatherDisplay();
        WeatherDisplay display2 = new WeatherDisplay();

        // Προσθέτουμε τους παρατηρητές στην πηγή
        weatherStation.RegisterObserver(display1);
        weatherStation.RegisterObserver(display2);

        // Αλλάζουμε τον καιρό
        weatherStation.SetWeather("Ηλιοφάνεια");
        weatherStation.SetWeather("Βροχή");

        // Αφαιρούμε έναν παρατηρητή
        weatherStation.UnregisterObserver(display2);

        // Αλλάζουμε ξανά τον καιρό
        weatherStation.SetWeather("Συννεφιά");
    }
}

Τι Κάνουμε Εδώ:

  1. Πηγή Νέων (WeatherStation):
    • WeatherStation είναι η πηγή που μπορεί να αλλάξει τον καιρό και να ενημερώσει τους παρατηρητές.
  2. Παρατηρητές (WeatherDisplay):
    • WeatherDisplay είναι οι φίλοι που θέλουν να ξέρουν τον καιρό κάθε φορά που αλλάζει.
  3. Καταχώρηση και Αφαίρεση Παρατηρητών:
    • RegisterObserver: Προσθέτει έναν νέο παρατηρητή.
    • UnregisterObserver: Αφαιρεί έναν παρατηρητή.
  4. Ενημέρωση Παρατηρητών:
    • NotifyObservers: Ενημερώνει όλους τους παρατηρητές για την αλλαγή.
  5. Αλλαγή Νέων:
    • SetWeather: Αλλάζει τον καιρό και ειδοποιεί τους παρατηρητές.

Συνοπτικά

  • Observer Pattern: Ένας τρόπος για να έχεις παρατηρητές που ενημερώνονται όταν κάτι αλλάζει.
  • C#: Χρησιμοποιούμε κώδικα C# για να δημιουργήσουμε την πηγή των νέων και τους παρατηρητές που θα ενημερώνονται για τις αλλαγές.