Ramesh
Ramesh

Reputation: 289

How can we implement observer pattern in .NET?

In .NET architecture,there are lot of design patterns.I want to know about what is meant with observer pattern and how it is implemented

Upvotes: 3

Views: 2447

Answers (5)

Marnix v. R.
Marnix v. R.

Reputation: 1698

this is a simple implementation of the observer pattern in c#, i added a lot of comments so hopefully it will be clear to you what it actually is :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleObserver
{
    class Program
    {
        static void Main(string[] args)
        {
            Newspaper newspaper = new Newspaper(); //create a Newspaper, which is a realization of Subject
            Grandma grandma = new Grandma(newspaper); //create a new Grandma, which is a realization of Observer
            newspaper.ChangeNews("no news today..."); //when the news get changed, grandma will automatically get it
            newspaper.ChangeNews("still no news..."); //and again
        }
    }

    //the subject which the observers are 'observing'
    //whenever something changes in the subject, the 
    //observers that are registered should be updated
    public interface Subject 
    {
        void RegisterObserver(Observer o); 
        void RemoveObserver(Observer o);
        void NotifyObservers(); 
    }

    //the actual subject, a newspaper which implements
    //the methods declared in the interface and it's own method
    //the goal is that whenever the news property changes 'by 
    //calling ChangeNews(string newNews); all the registered observers will
    //get that new news
    public class Newspaper : Subject
    {
        private List<Observer> observers = new List<Observer>(); //list with observers
        private string news = "initial news, nothing new!"; //the news

        public void RegisterObserver(Observer o)
        {
            this.observers.Add(o);
        }

        public void RemoveObserver(Observer o)
        {
            this.observers.Remove(o);
        }

        public void NotifyObservers()
        {
            foreach (Observer o in this.observers)
                o.Update(news); //update all the observers with the news
        }

        public void ChangeNews(string newNews) //method to manually change the news
        {
            this.news = newNews;
            this.NotifyObservers(); //automatically calls the NotifyObservers() method
        }
    }

    //the actual observer, has a method Update that will be
    //called by the Subject when something changes
    public interface Observer
    {
        void Update(string news);
    }

    //grandma is a observer, whenever the news changes she will be 
    //notified. she also has a reference to the subject instance, so
    //that she can cancel her subscription whenever needed
    public class Grandma : Observer
    {
        private Subject subject;

        public Grandma(Subject subject)
        {
            this.subject = subject; //set reference to the subject
            this.subject.RegisterObserver(this); //register to the subject
        }

        public void Update(string news)
        {
            Console.WriteLine("Granny reads the news, very slowly...");
            Console.WriteLine("The news today is... " + news);
        }
    }

    //possibly other observers go here...
}

Upvotes: 1

kyoryu
kyoryu

Reputation: 13055

The Observer pattern is pretty much reified in C# as events.

Upvotes: 6

Buhake Sindi
Buhake Sindi

Reputation: 89169

Wikipedia summarises it best:

The observer pattern (a subset of the publish/subscribe pattern) is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods. It is mainly used to implement distributed event handling systems.

An Observer (sometimes known as publish-subscribe pattern) is best used on GUI interfaces to update states of change on GUI objects such as all other objects can update itself (e.g. resizing a window, then all gui objects such as buttons can re-align itself based on window's size). This is usually done by introducing EventListeners (which is an Observer pattern).

For implementation, you can view the tutorial from either:

Hope this helps.

Upvotes: 5

Ian
Ian

Reputation: 34489

Check out DOFactory.

They have :

  • UML diagrams Advantages Disadvantages
  • Summary of main items involved C#
  • implementation C# implementation for
  • sample problem.

Upvotes: 1

Tomasz Jaskuλa
Tomasz Jaskuλa

Reputation: 16013

A good example of observer pattern is shown on MSDN.

You can find it here :

http://msdn.microsoft.com/en-us/library/ms998543.aspx

Upvotes: 1

Related Questions