Наблюдател (шаблон)

Наблюдател (на английски: Observer) е поведенчески шаблон за дизайн, който се използва в обектно-ориентираното програмиране. Използва се в случаите, при които група от обекти (наблюдатели) след регистрацията им към регистриращ обект биват оповестявани за промени в неговото състояние.

// Наблюдател
using System;
using System.Collections.Generic;

namespace Observer
{
  /// <summary>
   /// Observer Design Pattern – главна програма
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// стартиращ метод на програмата
    /// </summary>
    static void Main ()
    {
      // конфигуриране
      ConcreteSubject objConcreteSubject = new ConcreteSubject ();
      objConcreteSubject.Attach (new ConcreteObserver (objConcreteSubject, "X"));
      objConcreteSubject.Attach (new ConcreteObserver (objConcreteSubject, "Y"));
      objConcreteSubject.Attach (new ConcreteObserver (objConcreteSubject, "Z"));
      // промени темата и съобщи за промяната на наблюдателите
      objConcreteSubject.SubjectState = "ABC";
      objConcreteSubject.Notify ();
      // промени темата и съобщи за промяната на наблюдателите
      objConcreteSubject.SubjectState = "DEF";
      objConcreteSubject.Notify ();

      Console.ReadKey ();
    }
  }
  /// <summary>
  /// Абстрактен клас на темата
  /// </summary>
  abstract class Subject
  {
    private List<Observer> _LstObservers = new List<Observer> ();
    public void Attach (Observer objObserver)
    {
      _LstObservers.Add (objObserver);
    }
    public void Detach (Observer objObserver)
    {
      _LstObservers.Remove (objObserver);
    }
    public void Notify ()
    {
      foreach (Observer objObserver in _LstObservers)
      {
        objObserver.Update ();
      }
    }
  }

  /// <summary>
  /// Конкретния клас на темата
  /// </summary>
  class ConcreteSubject : Subject
  {
    private string _subjectState;
    // Gets or sets subject state
    public string SubjectState
    {
      get { return _subjectState; }
      set { _subjectState = value; }
    }
  }

  /// <summary>
  /// абстрактния клас на Наблюдателя
  /// </summary>
  abstract class Observer
  {
    public abstract void Update ();
  }
  /// <summary>
  /// Конкретния наблюдател
  /// </summary>
  class ConcreteObserver : Observer
  {
    private string _name;
    private string _LstObserverstate;
    private ConcreteSubject _subject;
    // Constructor
    public ConcreteObserver (

      ConcreteSubject subject, string name)
    {
      this._subject = subject;
      this._name = name;
    }

    public override void Update ()
    {
      _LstObserverstate = _subject.SubjectState;
      Console.WriteLine ("Observer {0}'s new state is {1}",
        _name, _LstObserverstate);
    }
    // Сложи или предай тема
    public ConcreteSubject Subject
    {
      get { return _subject; }
      set { _subject = value; }
    }
  }
}