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
1
2
3
4
5
6
package com.observerpattern.example;
 
public interface Observable {
 public void registerObserver(Observer observer);
 public void notifyObsevers();
}
Observer.java
1
2
3
4
5
package com.observerpattern.example;
 
public interface Observer {
 public void update(float salary);
}
Account.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
package com.observerpattern.example;
 
import java.util.ArrayList;
import java.util.List;
 
public class Account implements Observable {
 float salary;
 List<observer> 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;
 }
 
}
</observer>
Bank.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
1
2
3
4
5
6
7
8
9
10
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
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
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
1
2
3
4
5
6
7
8
9
10
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