Friday, 26 October 2012

The Observer Pattern



Observer Pattern = publisher + subscriber.
The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods. It is mainly used to implement distributed event handling systems. The Observer pattern is also a key part in the familiar Model View Controller (MVC) architectural pattern
This pattern has been used in GUI action mechanism. Here is a typical example about head hunter. Job seekers subscribe to a head hunter, and get noticed when head hunter have job information. 





Subject interface.

package com.programcreek.designpatterns.observer;

public interface Subject {
   public void registerObserver(Observer o);
   public void removeObserver(Observer o);
   public void notifyAllObservers();
}

Observer interface.

package com.programcreek.designpatterns.observer;

public interface Observer {
   public void update(Subject s);
}

HeadHunter class implements Subject.

package com.programcreek.designpatterns.observer;

import java.util.ArrayList;

public class HeadHunter implements Subject{

   //define a list of users, such as Mike, Bill, etc.
   private ArrayList<Observer> userList;
   private ArrayList<String> jobs;

   public HeadHunter(){
      userList = new ArrayList<Observer>();
      jobs = new ArrayList<String>();
   }

   @Override
   public void registerObserver(Observer o) {
      userList.add(o);
   }

   @Override
   public void removeObserver(Observer o) {}

   @Override
   public void notifyAllObservers() {
      for(Observer o: userList){
         o.update(this);
      }
   }

   public void addJob(String job) {
      this.jobs.add(job);
      notifyAllObservers();
   }

   public ArrayList<String> getJobs() {
      return jobs;
   }

   public String toString(){
      return jobs.toString();
   }
}

JobSeeker is an observer.

package com.programcreek.designpatterns.observer;

public class JobSeeker implements Observer {

   private String name;

   public JobSeeker(String name){
      this.name = name;
   }
   @Override
   public void update(Subject s) {
      System.out.println(this.name + " got notified!");
      //print job list
      System.out.println(s);
   }
}

Start Point.

import com.programcreek.designpatterns.observer.HeadHunter;
import com.programcreek.designpatterns.observer.JobSeeker;

public class Main {

   public static void main(String[] args) {
      HeadHunter hh = new HeadHunter();
      hh.registerObserver(new JobSeeker("Mike"));
      hh.registerObserver(new JobSeeker("Chris"));
      hh.registerObserver(new JobSeeker("Jeff"));

      //Each time, a new job is added, all registered job seekers will get noticed.
      hh.addJob("Google Job");
      hh.addJob("Yahoo Job");
   }
}

Kindly provide your valuable feedback in comment box.

No comments:

Post a Comment