Tuesday, 14 June 2016

Observer Design Pattern- JAVA Implementation

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