In this post, We will talk and learn about the Observer Design Pattern in Java.
Key Points About Observer Design Pattern :
- Observer Patternfalls under behavioral design pattern.
- An observer design pattern is very useful when you are interested in the state of an object and want to get notified whenever there is any change or update.
- In an observer pattern, the object that keeps watch on the state of another object are called the object that is being watched is called Subject.
- In this Pattern, we define a one-to-many relationship or dependency between objects so that when one object changes state than all its dependent objects are notified and updated automatically.
- The subject has a list of observers to notify of any change in its state, so it provides a method using which observers can register and unregister themselves. The subject also contains a method to notify all the observers of any change or update and either it can send the update while notifying the observer or it can provide another method to get the update.
Observer Design Pattern in JDK & J2EE:
- java.util. Observer & java.util.Observable
- javax.servlet.http.HttpSessionBindingListener
- javax.servlet.http.HttpSessionAttributeListener
Now Let’s move towards the implementation of the Observer Design Pattern.
Below is the complete source code:
Message.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.kkjavatutorials.message; /** * @author KK JavaTutorials *Model class to represent message */ public final class Message { private final String message; public Message(String message) { this.message = message; } public String getMessage() { return message; } } |
Observer.java
1 2 3 4 5 6 7 8 9 10 |
package com.kkjavatutorials.observer; import com.kkjavatutorials.message.Message; /** * @author KK JavaTutorials *Observer has to fullfil this contract */ public interface Observer { public void updateObserver(Message message); } |
FirstMessageSubscriber.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.kkjavatutorials.observer.impl; import com.kkjavatutorials.message.Message; import com.kkjavatutorials.observer.Observer; /** * @author KK JavaTutorials * Implementaion of FirstMessageSubscriber */ public class FirstMessageSubscriber implements Observer { @Override public void updateObserver(Message message) { System.out.println("Message for first subscriber :: " + message.getMessage()); } } |
SecondMessageSubscriber.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.kkjavatutorials.observer.impl; import com.kkjavatutorials.message.Message; import com.kkjavatutorials.observer.Observer; /** * @author KK JavaTutorials *Implementaion of SecondMessageSubscriber */ public class SecondMessageSubscriber implements Observer { @Override public void updateObserver(Message message) { System.out.println("Message for Second subscriber :: " + message.getMessage()); } } |
ThirdMessageSubscriber.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.kkjavatutorials.observer.impl; import com.kkjavatutorials.message.Message; import com.kkjavatutorials.observer.Observer; /** * @author KK JavaTutorials *Implementaion of ThirdMessageSubscriber */ public class ThirdMessageSubscriber implements Observer { @Override public void updateObserver(Message message) { System.out.println("Message for Third subscriber :: " + message.getMessage()); } } |
Subject.java
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import com.kkjavatutorials.message.Message; import com.kkjavatutorials.observer.Observer; /** * @author KK JavaTutorials * Cotract for register,unregister & * notifyUpdate to Observer */ public interface Subject { public void register(Observer observer); public void unregister(Observer observer); public void notifyUpdate(Message message); } |
MessagePublisher.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package com.kkjavatutorials.subject.impl; import java.util.HashSet; import java.util.Set; import com.kkjavatutorials.message.Message; import com.kkjavatutorials.observer.Observer; import com.kkjavatutorials.subject.Subject; /** * @author KK JavaTutorials *This class is responsible to *register,unregister & notifyUpdate an Observer */ public class MessagePublisher implements Subject { // Collection of observers private Set<Observer> observers = new HashSet<>(); /** * Method to register an Observer */ @Override public void register(Observer observer) { observers.add(observer); } /** * Method to unregister an Observer */ @Override public void unregister(Observer observer) { observers.remove(observer); } /** * Method to notifyUpdate for Subcribed * Observer */ @Override public void notifyUpdate(Message message) { for(Observer observer: observers) { observer.updateObserver(message); } } } |
ObserverTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com.kkjavatutorials.client; import com.kkjavatutorials.message.Message; import com.kkjavatutorials.observer.impl.FirstMessageSubscriber; import com.kkjavatutorials.observer.impl.ThirdMessageSubscriber; import com.kkjavatutorials.subject.impl.MessagePublisher; import com.kkjavatutorials.observer.impl.SecondMessageSubscriber; /** * @author KK JavaTutorials *Client program to demo Observer Design Pattern */ public class ObserverTest { public static void main(String[] args) { //Creating Three Subscribers FirstMessageSubscriber firstMessageSubscriber = new FirstMessageSubscriber(); SecondMessageSubscriber secondMessageSubscriber = new SecondMessageSubscriber(); ThirdMessageSubscriber thirdMessageSubscriber = new ThirdMessageSubscriber(); //Creating Message Publisher MessagePublisher messagePublisher = new MessagePublisher(); //Register two Subscribers to get notifications on any update messagePublisher.register(firstMessageSubscriber); messagePublisher.register(secondMessageSubscriber); //firstMessageSubscriber and secondMessageSubscriber will receive the update messagePublisher.notifyUpdate(new Message("This is First Message")); System.out.println("---------------------------------------------------------------"); /*Now UnRegister firstMessageSubscriber so that it won't get notification on any update*/ messagePublisher.unregister(firstMessageSubscriber); //Now Register one more Subscriber to get notifications on any update messagePublisher.register(thirdMessageSubscriber); //secondMessageSubscriber and thirdMessageSubscriber will receive the update messagePublisher.notifyUpdate(new Message("This is Second Message")); } } |
Output of this Program:
Message for first subscriber :: This is First Message
Message for Second subscriber :: This is First Message
—————————————————————
Message for Third subscriber :: This is Second Message
Message for Second subscriber :: This is Second Message
You May Also Like:
Singleton Design Pattern in java
Prototype Pattern in Java
Factory Pattern in Java
Abstract Factory Pattern in Java
Builder Pattern in Java
Adapter Design Pattern in Java
Decorator Design Pattern in Java
Facade Design Pattern in Java
Bridge Design Pattern in Java.
Mediator Design Pattern in Java
Strategy Design Pattern in java
That’s all about the Observer Design Pattern in Java.
If you have any feedback or suggestion please feel free to drop in below comment box.