Implementazione del modello di progettazione Observer in C #

Il modello di progettazione Observer rientra nella categoria Schema di progettazione comportamentale e viene utilizzato quando si desidera notificare la modifica a un numero di classi. I modelli di progettazione comportamentale sono quelli utilizzati per trattare la collaborazione con gli oggetti e la delega delle responsabilità.

In sostanza, il design pattern Observer viene utilizzato per definire il modo in cui la comunicazione tra i componenti di un'applicazione interagisce tra loro o si informano a vicenda inviando messaggi. In questo modello, il soggetto mantiene un elenco degli osservatori e quindi notifica questi osservatori o le persone a carico quando e quando si verifica un cambiamento di stato. Puoi anche aggiungere o rimuovere osservatori in fase di esecuzione.

Applicabilità

Quando dovresti usare questo modello di design? È una buona scelta quando desideri avere un argomento che deve essere osservato da uno o più osservatori. È un modello di progettazione popolare che aiuta a implementare uno scenario di editore / abbonato in cui le modifiche allo stato di un oggetto possono essere notificate a tutti gli oggetti dipendenti o sottoscrittori (in un'implementazione tipica dello scenario editore / abbonato). Nel design pattern Observer, i cambiamenti di stato di un oggetto vengono comunicati a un altro oggetto senza la necessità che gli oggetti siano strettamente accoppiati tra loro.

Il pattern architettonico MVC (Model View Component) è un classico esempio di implementazione del design pattern Observer. Il modello architettonico MVC viene utilizzato per creare applicazioni che sono liberamente accoppiate, più facili da testare e mantenere. In una tipica implementazione MVC, la vista e il modello sono separati l'uno dall'altro. Mentre la vista rappresenta l'osservatore, il modello rappresenta il tuo oggetto osservabile.

Implementazione del modello di progettazione Observer

Ne abbiamo abbastanza dei concetti: ora comprendiamo questo modello di progettazione con un'implementazione. Prima di tutto, dobbiamo conoscere le classi oi tipi partecipanti.

  • Oggetto: è rappresentato da un tipo utilizzato per definire un'interfaccia per collegare o scollegare uno o più osservatori
  • ConcreteSubject: viene utilizzato per notificare agli osservatori quando si verifica un cambiamento di stato
  • Osservatore: rappresenta il tipo da notificare in caso di modifica
  • ConcreteObserver: rappresenta l'implementazione concreta del tipo di osservatore

In un'implementazione tipica del modello di progettazione Observer, potresti voler avere un tipo di soggetto e un tipo di osservatore. Ecco uno snippet di codice che lo illustra.

    public abstract class Subject

    {

        protected List lstObservers = new List();

        protected void Register(Observer observer)

        {

            lstObservers.Add(observer);

        }

        protected void UnRegister(Observer observer)

        {

            lstObservers.Remove(observer);

        }

        protected void UnRegisterAll()

        {

            foreach (Observer observer in lstObservers)

            {

                lstObservers.Remove(observer);

            }

        }

        public abstract void Notify();

    }

public abstract class Observer

    {

        public abstract void Update();

    }

Ora, fai riferimento allo snippet di codice riportato sopra. La classe Subject contiene un elenco di istanze di Observer e alcuni metodi per aggiungere o rimuovere i sottoscrittori, ovvero istanze della classe Observer. Si noti che il metodo Notify è stato dichiarato astratto: la classe che estenderebbe la classe Subject deve fornire la rispettiva implementazione per questo metodo. La classe Observer contiene un solo metodo: il metodo Update. Ho reso questa implementazione il più semplice possibile.

La classe BlogPost estende la classe Subject e implementa il metodo Notify che è stato dichiarato astratto nella classe Subject.

public class BlogPost: Subject

    {

        public void Attach(Observer observer)

        {

            //You can write your own implementation here or call the base version

            base.Register(observer);

        }

        public void Detach(Observer observer)

        {

            //You can write your own implementation here or call the base version

            base.UnRegister(observer);

        }

        public void DetachAll()

        {

            //You can write your own implementation here or call the base version

            base.UnRegisterAll();

        }

        public override void Notify()

        {

            foreach (Observer observer in lstObservers)

            {

                observer.Update();

            }

        }

    }

La classe ConcreteObserver è fornita di seguito. Lascio ai lettori il compito di scrivere il proprio codice nel metodo Update per inviare un'e-mail di notifica che un articolo è stato pubblicato, o, ecc.

public class ConcreteObserver : Observer

    {

        public string Email

        {

            get; set;

        }

        public override void Update()

        {

            Console.WriteLine("Inside the Update method...");

        }

    }

Puoi saperne di più sul design pattern Observer da questo link.