Наблюдател (шаблон)
от Уикипедия, свободната енциклопедия
Наблюдател (Observer) е поведенчески шаблон за дизайн, който се използва в обектно-ориентираното програмиране. Използва се в случаите, при които група от обекти (наблюдатели ) след регистрацията им към регистриращ обект биват оповестявани за промени в неговото състояние.
egistered objects are notified of and updated with a state change.
Съдържание |
Примери [редактиране]
C++ [редактиране]
C# [редактиране]
// Наблюдател 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; } } } }