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

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

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


egistered objects are notified of and updated with a state change.


Съдържание

Примери[редактиране | edit source]

C++[редактиране | edit source]

C#[редактиране | edit source]

// Наблюдател
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; }
    }
  }
}

Java[редактиране | edit source]