Design Patterns - Observer Pattern






2.75/5 (9 votes)
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.

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();
}
}