Click here to Skip to main content
Click here to Skip to main content

Tagged as

Design Patterns - Observer Pattern

, 25 Jan 2008 CPOL
Rate this:
Please Sign up or sign in to vote.
Explains the observer pattern and simple implementation

Introduction

This article explains the Observer pattern which is one of C# Design Patterns. The article provides a very simple implementation so its complexity can be easily understood. The observer pattern makes an object such that if its state changed somehow, other instances will be notified (or updated) automatically.

observer

This is taken from dofactory.com.

Implementation

Imagine if we have a cards game, some tables, and some players. On a table, in the game context the suit of cards is changed periodically and we want to notify the players each time the suit is changed. Note* this is not a complete logic for a cards game, it's an example. The player object is going to have a function Update() which will be called by the notifier, and data:

  • Player Number (Player Identity) int
  • Current Suit string
  • Current Table Object Table

How can the player be notified? We pass the (always changes) object of the table as a parameter in the Update() function, So the player (object) can see the new differences in the table (object). This is the Player object..

interface IPlayer
{
    void Update(Table _table);
}

class Player : IPlayer
{
    public void Update(Table _table)
    {
        this._table = _table;
        _currentSuit = _table.currentSuit;
        Console.WriteLine("Player '" + _PlayerNo + "' 
		notified that current suit is " + _currentSuit);
    }

    private int _PlayerNo;
    private Table _table;
    private string _currentSuit;

    public Player(int _PlayerNo)
    {
        this._PlayerNo = _PlayerNo; 
    }

    public Table CurrentTable 
    { 
        get { return _table; } 
    }
}

In our table object, you want to add players or remove players (or count them for some reason). So in the table object, you'll have:

  • An array list of the players objects List<Player>
  • Current Suit string
  • Table Number int
  • Add Player Function AddPlayer()
  • Remove Player Function RemovePlayer()
  • Notify Function Notify()

The notify function sends the updated object (table) to all players objects:

abstract class Table
{
    private string _currentSuit;
    private int _tableNo;
    private List< Player > players = new List< Player >();

    public Table(int _tableNo, string _currentSuit)
    {
        this._tableNo = _tableNo;
        this._currentSuit = _currentSuit;
    }
    public void AddPlayer(Player _player)
    {
        players.Add(_player);
    }

    public void RemovePlayer(Player _player)
    {
        players.Remove(_player);
    }

    public string currentSuit
    {
        get { return _currentSuit; }
        set
        {
            _currentSuit = value;
            Notify();
        }
    }

    public void Notify()
    {
        foreach (Player _player in players)
        {
            _player.Update(this);
        }
    }
}

class ReadyTable : Table
{
    public ReadyTable(int _tableNo, string _currentSuit) : 
		base(_tableNo, _currentSuit)
    { }
}

And the Main():

class Program
{
    static void Main(string[] args)
    {
        //Create Table
        //specify a table id and a starting suit
        ReadyTable table = new ReadyTable(1, "Spade");
        Console.WriteLine("Starting table 1 with suit spades, 
			suit will be changing in 3 seconds");

        //Create Players
        List< Player > players = new List< Player >(4);//specify number of players
        for (int i = 0; i < 4; i++)
        {
            players.Add(new Player(i));
            //add players to the table
            table.AddPlayer(players[i]);
        }

        Thread.Sleep(3000);
        //Change the suit and all players will be notified
        table.currentSuit = "Hearts";

        Thread.Sleep(6000);
        table.currentSuit = "Diamonds";

        Console.ReadLine();
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Islam ElDemery
Web Developer Business Development Gate
Egypt Egypt
Blog
Follow on   Twitter

Comments and Discussions

 
GeneralEvents PinmemberSteve Hansen24-Jan-08 19:44 
GeneralRe: Events PinmemberIslam ElDemery24-Jan-08 23:13 
GeneralA class diagram is needed.. PinmemberNirosh24-Jan-08 15:48 
GeneralRe: A class diagram is needed.. PinmemberIslam ElDemery24-Jan-08 23:08 
You are right..
 
but I didnt include any (not easily understood) diagrams, So the article becomes as easy as I wanted (Its not necessary to understand UML to know the design patterns)..
 

GeneralI am sorry to say this... PinmemberNirosh24-Jan-08 23:48 
GeneralRe: I am sorry to say this... PinmemberIslam ElDemery25-Jan-08 0:13 
GeneralRe: I am sorry to say this... PinmemberNirosh25-Jan-08 3:32 
GeneralRe: I am sorry to say this... PinmemberIslam ElDemery25-Jan-08 3:38 
GeneralI know the place... PinmemberNirosh25-Jan-08 3:38 
GeneralRe: I know the place... PinmemberIslam ElDemery25-Jan-08 3:42 
GeneralRe: I know the place... PinmemberNirosh25-Jan-08 3:43 
GeneralRe: I know the place... PinmemberIslam ElDemery25-Jan-08 3:49 
GeneralRe: I am sorry to say this... PinmemberRavi Bhavnani25-Jan-08 1:33 
GeneralRe: I am sorry to say this... PinmemberNirosh25-Jan-08 3:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.141015.1 | Last Updated 25 Jan 2008
Article Copyright 2008 by Islam ElDemery
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid