Let us have a look at the eventing or observer pattern. This pattern is based on the raising and handling of events. Events are a mechanism for the communication between object that allow us to build loosely coupled applications that can be easily extended.
At a high level this pattern functions as follows:
An object (known as the Publisher) defines a contract (delegate method) to which other objects (knows as Subscribers) must comply in order to be notified of a certain condition occurring in the Publisher object. This is achieved as follows, when a certain state is reached in the Publisher object an event will be raised, which will then trigger all the Subscriber objects to react by executing the method defined within the individual Subscriber objects that matches the delegate method as defined in the Publisher.
Now let us have a look at an example:
First let us create the Publisher, here we have to do three things:
1. Define a delegate which will act as the contract between the Publisher and Subscribers.
2. Define an event based on the delegate.
3. Raise the defined event.
public class KillerRobotPublisher
{
public delegate void KillerRobotEventHandler(object source, EventArgs args);
public event KillerRobotEventHandler KillerRobotAction;
protected virtual void OnKillerRobotAction()
{
if(KillerRobotAction!=null) //check if there are any subscribers
{
KillerRobotAction(this,EventArgs.Empty);
}
}
public void DoKillerRobotAction(string action)
{
Console.WriteLine(“Killer Robot is doing “ +action);
//add additional action logic here
OnKillerRobotAction();
}
}
Next let us create a Subscriber to subscribe to the KillerRobotAction event on the Publisher.
public class KillerRobotSubscriber
{
public void OnKillerRobotAction(object source, EventArgs args)
//this method conforms to the delegate defined in the Publisher
{
Console.WriteLine(“The Killer Robot did something!”);
}
}
Now lastly let us create a basic application to instantiate the objects and to subscribe the Subscriber to the Publisher:
class Program
{
static void Main(string[] args)
{
var killerRobotPub = new KillerRobotPublisher(); //Instantiate Publisher Object
var killerRobotSub = new KillerRobotSubscriber(); //Instantiate Subscriber Object
killerRobotPub.KillerRobotAction += killerRobotSub.OnKillerRobotAction;
//Subscribe the KillerRobotSubscriber to the KillerRobotAction event on the KillerRobotPublisher.
killerRobotPub.DoKillerRobotAction(“A Dance”);
}
}
The console output of this application will look like this:
