What is Observer Design Pattern?
The observer pattern involves
constant observation of a "Subject of interest" (called as Subject) by different stake holders
(called as Observers or
Subscribers), so that the subscribers can get notified automatically for
any state change or update in the subject properties.
Real world example:
Assume that for a bank loan,
information are available through Newspaper and Internet. Any change in the
rate of interest or name of the loan is published in the Newspaper or Internet.
This is a typical example of
Observer Pattern, where the subject is "Loan" and observers/subscribers are
"Newspaper" and "Internet"
Implementation using Java.
Classes:
Subject: Abstract class containing the key
properties and behaviors for the subject type
Loan: Implements Subject class and has its
own properties, like rate of interest, loan name, loan type.
Subscriber: Abstract class containing key
properties and behaviors for a subscriber or observer
Internet: One of the subscribers, who implement
Subscriber class
Newspaper: One of the subscribers, who implement
Subscriber class
ObserverPatternImplementer: It is the main class, which creates
the objects and implements the observer pattern
Subject Class:
package
org.rajesh.javaconcepts4u.dto;
import java.util.ArrayList;
import java.util.List;
abstract class Subject {
List<Subscriber> subscriberList = new
ArrayList<Subscriber>();
abstract void addSubscriber(Subscriber
subscriber);
abstract void removeSubscriber(Subscriber
subscriber);
public void notifySubscriber(Subscriber
subscriber)
{
subscriber.update(this);
}
public void notifyAllSubscribers(){
for(Subscriber subscriber:subscriberList)
{
subscriber.update(this);
}
}
}
Loan Class:
package org.rajesh.javaconcepts4u.dto;
public class Loan extends Subject {
private String loanName;
private String type ;
private int rateOfInterest;
public String getLoanName() {
return loanName;
}
public void setLoanName(String loanName) {
this.loanName = loanName;
notifyAllSubscribers();
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
notifyAllSubscribers();
}
public int getRateOfInterest() {
return rateOfInterest;
}
public void setRateOfInterest(int
rateOfInterest) {
this.rateOfInterest = rateOfInterest;
notifyAllSubscribers();
}
@Override
public void addSubscriber(Subscriber
subscriber) {
subscriberList.add(subscriber);
notifySubscriber(subscriber);
}
@Override
public void removeSubscriber(Subscriber
subscriber) {
subscriberList.remove(subscriber);
}
@Override
public String toString() {
return getType()+ " : "+ getLoanName() + " has rate of
interest of "+getRateOfInterest();
}
}
Subscriber Class:
package
org.rajesh.javaconcepts4u.dto;
public abstract class Subscriber {
protected Subject subject;
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
abstract void update(Subject subject);
}
Internet Class:
package
org.rajesh.javaconcepts4u.dto;
public class Internet extends
Subscriber{
@Override
void update(Subject subject) {
this.subject = subject;
System.out.println("Internet feed received: "+ subject);
}
}
Newspaper Class:
package
org.rajesh.javaconcepts4u.dto;
public class Newspaper extends
Subscriber{
@Override
void update(Subject subject) {
this.subject = subject;
System.out.println("Newspaper feed received: "+ this.subject);
}
}
ObserverPatternImplementer
Class:
package org.rajesh.javaconcepts4u.main;
import
org.rajesh.javaconcepts4u.dto.Internet;
import
org.rajesh.javaconcepts4u.dto.Loan;
import
org.rajesh.javaconcepts4u.dto.Newspaper;
import
org.rajesh.javaconcepts4u.dto.Subscriber;
public class
ObserverPatternImplementer {
public static void main(String[] args) {
// Created loan object
Loan loan = new Loan();
loan.setLoanName("Easy Home Loan");
loan.setType("Home Loan");
loan.setRateOfInterest(10);
//Created Subscribers
Subscriber newspaper = new Newspaper();
Subscriber internet = new Internet();
//Configuring the Subscribers to observe loan
newspaper.setSubject(loan);
internet.setSubject(loan);
//adding the subscribers to observe the subject/loan
System.out.println("Newpaper subscriber added");
loan.addSubscriber(newspaper);
System.out.println("Internet subscriber added");
loan.addSubscriber(internet);
//Changing loan interest rate
System.out.println("Changing the rate of interest rate from 10 to 8
");
loan.setRateOfInterest(8);
}
}
Sample Output:
Newpaper subscriber added
Newspaper feed received: Home Loan
: Easy Home Loan has rate of interest of 10
Internet subscriber added
Internet feed received: Home Loan :
Easy Home Loan has rate of interest of 10
Changing the rate of interest rate
from 10 to 8
Newspaper feed received: Home Loan
: Easy Home Loan has rate of interest of 8
Internet feed received: Home Loan :
Easy Home Loan has rate of interest of 8
Note: Please
share your comments and feedbacks
Although i don't understand much of these technical jargons but the way you have explained is way easier to understand to some extent...
ReplyDelete