Observer

GOF Intent:
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

اين Pattern با نام هاي Dependents و Publish-Subscribe نيز شناخته مي شوند.

وقتي از اين Pattern استفاده مي شود که با تغيير در يک Object، لازم است تعداد ديگري از Object ها هم تغيير کنند يا از تغيير Object اول مطلع گردند.

اين Pattern يکي از اجزاي کليدي Pattern معماري MVC است.

ساختار اين Pattern بدين صورت است:

نمونه کد:

public interface Subject {
   public void register(Observer o);
   public void unregister(Observer o);
   public void notifyObservers();
}


public interface Observer {
   public void update(int state);
}


public class ConcreteSubject implements Subject{
   ArrayList<Observer> list = new ArrayList<Observer>();
   int subjectState = 0;

   public void setState(int state){
      subjectState = state;
   }

   public void register(Observer o) {
      list.add(o);
   }

   public void unregister(Observer o) {
      list.remove(o);
   }

   public void notifyObservers() {
      for (Observer o :list){
         o.update(subjectState);
      }
   }
}


public class ConcreteObserver implements Observer{
   int observerState;
   Subject theSubject;

   public ConcreteObserver(Subject theSubject){
      this.theSubject = theSubject;
      theSubject.register(this);
   }

   public void update(int state) {
      observerState = state;
   }

   public void display(){
      System.out.println(“Current State is “+observerState);
   }
}


public class ConcreteObserver2 implements Observer{
   int observerState;

   public void update(int state) {
      observerState = state;
   }

   public void display(){
      System.out.println(“Current State is “+observerState);
   }
}


public static void main(String[] args){
   ConcreteSubject aSubject = new ConcreteSubject();

   ConcreteObserver observer1 = new ConcreteObserver(aSubject);

   ConcreteObserver2 observer2 = new ConcreteObserver2();
   aSubject.register(observer2);

   aSubject.setState(7);
   aSubject.notifyObservers();

   observer1.display();
   observer2.display();
}

بسياري از زبانهاي برنامه نويسي ، پياده سازي هايي از کلاس هاي Observer Pattern ارائه مي دهند. از جمله در جاوا

java.util.Observer
java.util.Observable

نمونه کد استفاده از کلاس هاي جاوا:

/****************************
Observable Class Implementation
****************************/
import java.util.Observable;

public class EventSource extends Observable{
   private String resp = “”;

   public void setResp(String resp){
      this.resp = resp;
      setChanged();
      notifyObservers(resp);
   }
}


/****************************
Observer Class Implementation
****************************/
import java.util.Observable;
import java.util.Observer;

public class ResponseHandler implements Observer {
   private String resp;

   public void update(Observable o, Object arg) {
      resp = (String)arg;
   }

   public void displayResp(){
      System.out.println(“Resp : “+resp);
   }
}


/****************************
Running Method
****************************/
public static void main(String[] args){
   EventSource es = new EventSource();
   ResponseHandler rh1 = new ResponseHandler();

   es.addObserver(rh1);

   es.setResp(“Hello to All Observers!”);

   rh1.displayResp();
}

تفاوت Mediator Pattern و Observer Pattern
اين دو Pattern از نظر شکل و نحوه پياده سازي شباهت زيادي با هم دارند. اما آنچه که اين دو را از هم متمايز مي کند اين است که…
در Mediator Pattern، همه Object ها مي توانند نقش Sender و Receiver را ايفا کنند. فقط ارسال و دريافت با مديريت يک Object جداگانه به نام mediator صورت مي گيرد
اما در Observer Pattern، نقش Sender و Receiver کاملا مشخص و از هم تفکيک شده است. در اين Pattern هميشه يک فرستنده (Subject) و چندين دريافت کننده (Observer) داريم.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Observer in Wikipedia
  3. Observer in Codeproject
  4. Observer in Devlake

پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


− 1 = پنج

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com