What is Observer Pattern ?
The observer design pattern enables a subscriber to register with and receive notifications from a provider. It is suitable for any scenario that requires push-based notification. The pattern defines a provider (also known as a subject or an observable) and zero, one, or more observers. Observers register with the provider, and whenever a predefined condition, event, or state change occurs, the provider automatically notifies all observers by calling one of their methods. In this method call, the provider can also provide current state information to observers. In the .NET Framework, the observer design pattern is applied by implementing the generic System.IObservable(Of T) and System.IObserver(Of T) interfaces. The generic type parameter represents the type that provides notification information.
Example :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace ObserverPatternDBHandler { class Program { static void Main(string[] args) { SqlConnection objconnection = new SqlConnection("Data Source=devserv,1499;Network Library=DBMSSOCN;Initial Catalog=dev;User ID=dev;Password=dev123;"); // Configure Observer pattern ConcreteSubject s = new ConcreteSubject(); s.Attach(new ConcreteObserver(s, "DBUsingThread1")); s.Attach(new ConcreteObserver(s, "DBUsingThread2")); s.Attach(new ConcreteObserver(s, "DBUsingThread3")); // Change subject and notify observers objconnection.Open(); s.SubjectState = objconnection.State==System.Data.ConnectionState.Open?true:false; s.Notify(); objconnection.Close(); s.SubjectState = objconnection.State == System.Data.ConnectionState.Open ? true : false; s.Notify(); // Wait for user Console.ReadKey(); } } abstract class Subject { private List<Observer> _observers = new List<Observer>(); public void Attach(Observer observer) { _observers.Add(observer); } public void Detach(Observer observer) { _observers.Remove(observer); } public void Notify() { foreach (Observer o in _observers) { o.Update(); } } } /// <summary> /// The 'ConcreteSubject' class /// </summary> class ConcreteSubject : Subject { private bool _subjectState; // Gets or sets subject state public bool SubjectState { get { return _subjectState; } set { _subjectState = value; } } } /// <summary> /// The 'Observer' abstract class /// </summary> abstract class Observer { public abstract void Update(); } /// <summary> /// The 'ConcreteObserver' class /// </summary> class ConcreteObserver : Observer { private string _name; private bool _observerState; private ConcreteSubject _subject; // Constructor public ConcreteObserver( ConcreteSubject subject, string name) { this._subject = subject; this._name = name; } public override void Update() { _observerState = _subject.SubjectState; Console.WriteLine("Observer {0}'s new state is {1}", _name, _observerState?"Connected":"Disconnected"); } // Gets or sets subject public ConcreteSubject Subject { get { return _subject; } set { _subject = value; } } } } |
Output:
No comments:
Post a Comment