Observer Pattern

Observer Pattern Java Design Pattern Tutorial
Observer Pattern:Observer Pattern defines a one-to-many dependency between objects so that when on object changes state, all its dependents are notified and updated accordingly.

Example 1 using custom Observable and Observer Interface

Observable.java
package com.observerpattern.example;

public interface Observable {
 public void registerObserver(Observer observer);
 public void notifyObsevers();
}
Observer.java
package com.observerpattern.example;

public interface Observer {
 public void update(float salary);
}
Account.java
package com.observerpattern.example;

import java.util.ArrayList;
import java.util.List;

public class Account implements Observable {
 float salary;
 List listObserver = new ArrayList<>();

 public void setSalary(float salary) {
  this.salary = salary;
  System.out.println("Salary Credited successfully into Account");
  salaryCredited();
 }

 public void salaryCredited() {
  notifyObsevers();
 }

 @Override
 public void registerObserver(Observer observer) {
  listObserver.add(observer);
 }

 @Override
 public void notifyObsevers() {
  for (Observer observer : listObserver) {
   observer.update(this.salary);
  }

 }

 public float getSalary() {
  return salary;
 }

}
Bank.java
package com.observerpattern.example;

public class Bank implements Observer {
 
 Observable account;
 float salary;

 public Bank(Observable account) {
  this.account = account;
  account.registerObserver(this);
 }

 @Override
 public void update(float salary) {
  this.salary = salary;
  if(this.salary > 0){
   System.out.println("EMI Amount successfully deducted from your Account");
  }else{
   System.out.println("Account doesn't have sufficient balance for emi deduction");
  }
 }

}
AccountTestDrive.java
package com.observerpattern.example;

public class AccountTestDrive {
 public static void main(String[] args) {
  Account account = new Account();
  Bank bank = new Bank(account);
  //when salary is credited into Account(Observable),Bank(Observer) will be notified
  account.setSalary(100000);
 }
}



Example 2 using java.util Observable Interface and Observer class

Account.java
package com.observerpattern.example2;

import java.util.Observable;

public class Account extends Observable {
 float salary;

 public void setSalary(float salary) {
  this.salary = salary;
  System.out.println("Salary Credited successfully into Account");
  salaryCredited();
 }
 
 public void salaryCredited(){
  setChanged();
  notifyObservers();
 }

 public float getSalary() {
  return salary;
 }
 
}
Bank.java
package com.observerpattern.example2;

import java.util.Observable;
import java.util.Observer;

public class Bank implements Observer {
 
 Observable account;

 public Bank(Observable account) {
  this.account = account;
  account.addObserver(this);
 }

 @Override
 public void update(Observable account, Object object) {
  if(account instanceof Observable){
   Account salaryAccount = (Account) account;
   if(salaryAccount.getSalary() > 0){
    System.out.println("EMI Amount successfully deducted from your Account");
   }else{
    System.out.println("Account doesn't have sufficient balance for emi deduction");
   }
  }
 }

}
AccountTestDrive.java
package com.observerpattern.example;

public class AccountTestDrive {
 public static void main(String[] args) {
  Account account = new Account();
  Bank bank = new Bank(account);
  //when salary is credited into Account(Observable),Bank(Observer) will be notified
  account.setSalary(100000);
 }
}
Home

No comments:

Post a Comment