เรียบเคียง Observer Pattern ใน Java

ให้จินตนาการว่า มี Objects จำนวน n, จะทำงานเฉพาะตน .. หากมีการเปลี่ยนแปลงภายใน Obj. ที่ถูกเฝ้าสังเกต (ทำการ Notify แก่ Observer อัตโนมัติ)

อ้างอิง: http://www.tutorialspoint.com/design_pattern/observer_pattern.htm 

ในที่นี้ เราจะเล่นกับ Class Subject ซึ่งถูก Observed โดย Class Observer  โดยสิ่งที่เราต้องการคือ ให้เริ่มต้นมี Object Subject อยู่แล้ว จากนั้น ให้ Observer แต่ละตัว ค่อยๆลงทะเบียนตัวเอง ขอให้ Subject แจ้ง Update ด้วย หากมีการเปลี่ยนแปลง  ดังนี้

public static void main(String[] args) {
  Subject subject = new Subject();

  new HexaObserver(subject);
  new OctalObserver(subject);
  new BinaryObserver(subject);

  System.out.println("> state change: 15"); 
  subject.setState(15);
  System.out.println("> state change: 10"); 
  subject.setState(10);
}

สังเกตได้ว่า เราเตรียมจะให้มี Observer 3 ตัวที่ จ้อง Subject หากมีการเปลี่ยนแปลง setState()

OK ตอนนี้มาสร้าง Class ที่จะถูก Observed, Subject

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

public class Subject {
    
   private List<Observer> observers = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
      observers.add(observer);      
   }

   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   }    
}

ตอนนี้มี Observed แล้ว จากนี้ก็ต้องมี Observer –> สร้างแม่แบบก่อน

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

และก็ Observers ทั้งสาม

public class BinaryObserver extends Observer{

   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); 
   }
}

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
     System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); 
   }
}

public class HexaObserver extends Observer{

   public HexaObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); 
   }
}

….

ที่เหลือก็ลอง Run ดู

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s