За информацията в тази статия или раздел не са посочени източници. Въпросната информация може да е непълна, неточна или изцяло невярна. Имайте предвид, че това може да стане причина за изтриването на цялата статия или раздел. |
Наблюдател (на английски: 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; }
}
}
}
|