Add

Observer Pattern

Observer pattern is based on the Publisher/Subscribers concept. There is one-to-many relationship. Many subscribers are registered or subscribed to one publisher. Whenever any change occurs in publisher, all of the subscribers, who are registered to it, are notified about the change.


Observer Pattern Example


Here is an example of News Agency system. News agency works as publisher while News readers work as subscribers. Whenever new news comes in then all of the news readers subscribed to it, get notified and receive the news.



Observer Pattern CD1

Observer Pattern CD2

    public interface IObservable
    {
        void Subscribe(IObserver observer);
        void Unsubscribe(IObserver observer);
        void NotifyChanges();
    }   

    public class NewsAgency : IObservable
    {
        private List observers;
        private string latestHeadline;

        public NewsAgency()
        {
            observers = new List();
            latestHeadline = string.Empty;
        }

        public void Subscribe(IObserver observer)
        {
            if (observer != null)
            {
                this.observers.Add(observer);
            }
        }

        public void Unsubscribe(IObserver observer)
        {
            if (observer != null)
            {
                this.observers.Remove(observer);
            }
        }

        public void NotifyChanges()
        {
            if (this.observers != null && this.observers.Count > 0)
            { 
                foreach(IObserver observer in this.observers)
                {
                    observer.Update(this.latestHeadline);
                }
            }
        }

        public void SetNewHeadline(string newHeadline)
        {
            this.latestHeadline = newHeadline;
            NotifyChanges();
        }
    }
    public interface IObserver
    {
        void Update(string latestHeadline);
    }
    public class NewsReader : IObserver
    {
        private NewsAgency newsAgency;
        private string latestNewsReceived;
        private string nameOfNewsReader;

        public NewsReader(NewsAgency newsAgency, string nameOfNewsReader)
        {
            this.newsAgency = newsAgency;

            this.newsAgency.Subscribe(this);

            this.latestNewsReceived = string.Empty;

            this.nameOfNewsReader = nameOfNewsReader;
        }

        public void Update(string latestHeadline)
        {
            this.latestNewsReceived = latestHeadline;
        }

        public void DisplayNews()
        {
            Console.WriteLine("Latest Headline for "+this.nameOfNewsReader+" : "
                                                    +  this.latestNewsReceived);
        }
    }
namespace ObserverPatternDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            NewsAgency newsAgency = new NewsAgency();

            NewsReader newsReaderX = new NewsReader(newsAgency,"Reader X");
            NewsReader newsReaderY = new NewsReader(newsAgency, "Reader Y");

            newsAgency.SetNewHeadline("Welcome to OmerJaved.com!");

            newsReaderX.DisplayNews();
            newsReaderY.DisplayNews();

            Console.ReadKey();
        }
    }
}

Observer Pattern Example Output



Observer Pattern CD2