Implementieren des Observer-Entwurfsmusters in C #

Das Observer-Entwurfsmuster fällt unter die Kategorie Verhaltensentwurfsmuster und wird verwendet, wenn Sie Änderungen an einer Reihe von Klassen melden möchten. Verhaltensentwurfsmuster sind solche, die verwendet werden, um die Objektzusammenarbeit und die Übertragung von Verantwortlichkeiten zu behandeln.

Im Wesentlichen wird das Observer-Entwurfsmuster verwendet, um zu definieren, wie die Kommunikation zwischen Komponenten in einer Anwendung miteinander interagiert oder sich gegenseitig durch Senden von Nachrichten benachrichtigt. In diesem Muster führt das Subjekt eine Liste der Beobachter und benachrichtigt diese Beobachter oder die abhängigen Personen, sobald eine Zustandsänderung stattfindet. Sie können Beobachter auch zur Laufzeit hinzufügen oder entfernen.

Anwendbarkeit

Wann sollten Sie dieses Entwurfsmuster verwenden? Es ist eine gute Wahl, wenn Sie ein Thema haben möchten, das von einem oder mehreren Beobachtern beobachtet werden muss. Es ist ein beliebtes Entwurfsmuster, mit dem Sie ein Herausgeber- / Abonnentenszenario implementieren können, in dem Änderungen am Status eines Objekts allen abhängigen Objekten oder Abonnenten mitgeteilt werden können (in einer typischen Implementierung des Herausgeber- / Abonnentenszenarios). Im Observer-Entwurfsmuster werden die Zustandsänderungen eines Objekts an ein anderes Objekt übertragen, ohne dass die Objekte eng miteinander gekoppelt sein müssen.

Das MVC-Architekturmuster (Model View Component) ist ein klassisches Beispiel für eine Implementierung des Observer-Entwurfsmusters. Das MVC-Architekturmuster wird verwendet, um Anwendungen zu erstellen, die lose gekoppelt, einfacher zu testen und zu warten sind. In einer typischen MVC-Implementierung sind die Ansicht und das Modell voneinander entkoppelt. Während die Ansicht den Beobachter darstellt, repräsentiert das Modell Ihr beobachtbares Objekt.

Implementieren des Observer-Entwurfsmusters

Wir haben genug von den Konzepten - lassen Sie uns nun dieses Entwurfsmuster mit einer Implementierung verstehen. Zunächst müssen wir die teilnehmenden Klassen oder Typen kennen.

  • Betreff: Dies wird durch einen Typ dargestellt, der zum Definieren einer Schnittstelle zum Anhängen oder Trennen eines oder mehrerer Beobachter verwendet wird
  • ConcreteSubject: Hiermit werden Beobachter benachrichtigt, wenn sich der Status ändert
  • Beobachter: Dies ist der Typ, der im Falle einer Änderung benachrichtigt werden sollte
  • ConcreteObserver: Dies ist die konkrete Implementierung des Beobachter-Typs

In einer typischen Implementierung des Observer-Entwurfsmusters möchten Sie möglicherweise einen Betreff- und einen Beobachter-Typ haben. Hier ist ein Codefragment, das dies veranschaulicht.

    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();

    }

Beziehen Sie sich nun auf das oben angegebene Code-Snippet. Die Subject-Klasse enthält eine Liste von Observer-Instanzen und einige Methoden zum Hinzufügen oder Entfernen der Abonnenten, dh Instanzen der Observer-Klasse. Beachten Sie, dass die Notify-Methode als abstrakt deklariert wurde - die Klasse, die die Subject-Klasse erweitern würde, muss die entsprechende Implementierung für diese Methode bereitstellen. Die Observer-Klasse enthält nur eine Methode - die Update-Methode. Ich habe diese Implementierung so einfach wie möglich gemacht.

Die BlogPost-Klasse erweitert die Subject-Klasse und implementiert die Notify-Methode, die in der Subject-Klasse als abstrakt deklariert wurde.

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();

            }

        }

    }

Die ConcreteObserver-Klasse ist unten angegeben. Ich überlasse es den Lesern, ihren eigenen Code in die Update-Methode zu schreiben, um eine E-Mail zu senden, die darüber informiert, dass ein Artikel veröffentlicht wurde, oder usw.

public class ConcreteObserver : Observer

    {

        public string Email

        {

            get; set;

        }

        public override void Update()

        {

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

        }

    }

Weitere Informationen zum Observer-Entwurfsmuster finden Sie unter diesem Link.