Introduction
I will attempt to explain what is one of the most widely used Design Patterns: Observer Pattern.
Problem domain: Implementing the Publisher/Subscriber scenario. We need a mechanism which allows us to notify subscriber objects whenever the publisher object changes state.
There is one publisher or subject class and one or more subscriber or observer classes.
Illustration
Explanation
In order for observers to receive a notification, they must implement some kind of update method which the subject can call whenever it changes state. The observers must have the freedom to register and un-register from subscription to the subject at any point in time.
The subject contains the stuff. So, whenever the stuff changes, observers need to be notified.
Here, the Observer Pattern comes to the rescue.
Implementation
We need to create two Interfaces: Subject and Observer. The interface for the subject contains the register, unregister, and notify method signatures, as follows:
public interface Subject
{
public void register(Observer o);
public void unregister(Observer o);
public void notify();
}
The interface for the observer contains an update method signature:
public interface Observer
{
public void update(int value);
}
Now, let us assume that we are building a sample stock market gadget app. Here, the subject is the one which has the 'stuff', i.e., the stock market quotes. The observers are different classes which display the latest stock quotes to the user.
Let us have classes representing the subject/observer relationship: the StockMarket class being the subject, and we have three different observer classes: GoogleStockGadget, YahooStockGadget, and MSNStockGadget.
The StockMarket class must implement the Subject interface:
public class StockMarket : Subject
{
// A Collection to keep track of all Registered Observers
ArrayList observers = new ArrayList();
// Stores latest stock quote (example is purposely simplistic)
int newValue = 0;
public void setValue(int v)
{
newValue = v;
}
public void register(Observer o)
{
observers.add(o);
}
public void unregister(Observer o)
{
int i = observers.indexOf(o);
observers.remove(i);
}
public void notify()
{
for (int i=0;i < observers.size();i++)
{
Observer ob = (Observer)observers.get(i);
ob.update(newValue);
}
}
}
The observers: GoogleStockGadget, YahooStockGadget, and MSNStockGadget, must implement the Observer interface.
Note that the observer classes must maintain a reference variable of type Subject.
public class GoogleStockGadet : Observer
{
int latestValue = 0;
Subject stockMarket; // Subject reference variable
// Note how subject is passed in the constructor of Observer
public GoogleStockGadet(Subject subject)
{
stockMarket = subject;
stockMarket.register(this); // Registering itself to the Subject
}
public void update(int value)
{
latestValue = value;
display();
}
public void display()
{
System.out.println("Latest Quote=" + latestValue);
}
public void unsubscribe()
{
stockMarket.unregister(this);
}
}
Similarly, YahooStockGadget and MSNStockGadget implement the observer interface.
Now, let's see how we make it all work in the main program.
public class MainProgram
{
public static void Main(string[] args)
{
//Initialize Subject
StockMarket stockMarket = new StockMarket();
int latestQuote = 0;
// Initialize Gadgets..Note the subject being passed in Constructor
GoogleStockGadget googleGadget = new GoogleStockGadget(stockMarket);
MSNStockGadget msnGadget = new MSNStockGadget(stockMarket);
YahooStockGadget yahooGadget = new YahooStockGadget(stockMarket);
// Code for Getting latest stock
// ....
// ....
stockMarket.setValue(latestQuote);
// Updating all Registered Observers
stockMarket.notify();
//GoogleGadget decides to unregister/unsubscirbe
googleGadget.unsubscribe();
}
}
With that, I end my article. Remember, the Observer Design Pattern solves the common problem of notifying several objects (i.e., Observers) about changes in the state of one principle object (or the Subject).
This, being my first article, might not be perfect, but hopefully, it has helped you in better understanding the concepts of the Observer Design Pattern.
Happy coding!
I will attempt to explain what is one of the most widely used Design Patterns: Observer Pattern.
Problem domain: Implementing the Publisher/Subscriber scenario. We need a mechanism which allows us to notify subscriber objects whenever the publisher object changes state.
There is one publisher or subject class and one or more subscriber or observer classes.
Illustration
Explanation
In order for observers to receive a notification, they must implement some kind of update method which the subject can call whenever it changes state. The observers must have the freedom to register and un-register from subscription to the subject at any point in time.
The subject contains the stuff. So, whenever the stuff changes, observers need to be notified.
Here, the Observer Pattern comes to the rescue.
Implementation
We need to create two Interfaces: Subject and Observer. The interface for the subject contains the register, unregister, and notify method signatures, as follows:
public interface Subject
{
public void register(Observer o);
public void unregister(Observer o);
public void notify();
}
The interface for the observer contains an update method signature:
public interface Observer
{
public void update(int value);
}
Now, let us assume that we are building a sample stock market gadget app. Here, the subject is the one which has the 'stuff', i.e., the stock market quotes. The observers are different classes which display the latest stock quotes to the user.
Let us have classes representing the subject/observer relationship: the StockMarket class being the subject, and we have three different observer classes: GoogleStockGadget, YahooStockGadget, and MSNStockGadget.
The StockMarket class must implement the Subject interface:
public class StockMarket : Subject
{
// A Collection to keep track of all Registered Observers
ArrayList observers = new ArrayList();
// Stores latest stock quote (example is purposely simplistic)
int newValue = 0;
public void setValue(int v)
{
newValue = v;
}
public void register(Observer o)
{
observers.add(o);
}
public void unregister(Observer o)
{
int i = observers.indexOf(o);
observers.remove(i);
}
public void notify()
{
for (int i=0;i < observers.size();i++)
{
Observer ob = (Observer)observers.get(i);
ob.update(newValue);
}
}
}
The observers: GoogleStockGadget, YahooStockGadget, and MSNStockGadget, must implement the Observer interface.
Note that the observer classes must maintain a reference variable of type Subject.
public class GoogleStockGadet : Observer
{
int latestValue = 0;
Subject stockMarket; // Subject reference variable
// Note how subject is passed in the constructor of Observer
public GoogleStockGadet(Subject subject)
{
stockMarket = subject;
stockMarket.register(this); // Registering itself to the Subject
}
public void update(int value)
{
latestValue = value;
display();
}
public void display()
{
System.out.println("Latest Quote=" + latestValue);
}
public void unsubscribe()
{
stockMarket.unregister(this);
}
}
Similarly, YahooStockGadget and MSNStockGadget implement the observer interface.
Now, let's see how we make it all work in the main program.
public class MainProgram
{
public static void Main(string[] args)
{
//Initialize Subject
StockMarket stockMarket = new StockMarket();
int latestQuote = 0;
// Initialize Gadgets..Note the subject being passed in Constructor
GoogleStockGadget googleGadget = new GoogleStockGadget(stockMarket);
MSNStockGadget msnGadget = new MSNStockGadget(stockMarket);
YahooStockGadget yahooGadget = new YahooStockGadget(stockMarket);
// Code for Getting latest stock
// ....
// ....
stockMarket.setValue(latestQuote);
// Updating all Registered Observers
stockMarket.notify();
//GoogleGadget decides to unregister/unsubscirbe
googleGadget.unsubscribe();
}
}
With that, I end my article. Remember, the Observer Design Pattern solves the common problem of notifying several objects (i.e., Observers) about changes in the state of one principle object (or the Subject).
This, being my first article, might not be perfect, but hopefully, it has helped you in better understanding the concepts of the Observer Design Pattern.
Happy coding!
No comments:
Post a Comment