[Algorithm] Observer Design Pattern

ในหัวข้อนี่เราจะมาพูดถึง Design อีกตัวที่ชื่อว่า Observer ที่อยู่ในโหมดของ behavioural ในรูปแบบนี้ก็จะเป็นการแก้ปัญหในเรื่อง พฤติกรรมของ Object และมีปฏิสัมพันธ์ระหว่าง Object และในตัวของ Observer เองเป็นการเขียนโปรแกรมแบบการแจ้งเตือนเหตุการณ์ข้อมูลจากคลาสหนึ่งไปอีกคลาสหนึ่ง ถ้าหากยังนึกภาพไม่ออกผมอยากให้นึกถึงแบบนี้ครับ

RSS ผมว่าทุกคนคงรู้จักคือเป็นการทำงานแบบ Observer ถ้าเราสมัครรับข่าวสารจากเราก็จะได้รับข่าวสารจากผู้ส่ง เมื่อผู้ส่งทำการอัพเดทเนื้อหา เราจะได้รับข้อมูลโดยอัตโนมัติซึ่งในทางเทคนิดเขาเรียกว่า publisher/subscriber มีความสัมพันธ์ในรูปแบบ 1 ผู้ส่ง:หลายผู้รับ หรือ one-to-many ครับ

ที่นี่มันคำกล่าวที่เกี่ยวกับ Pattern ตัวนี้ว่า ซึ่งเป็นหลักการทำงานของมันคือ

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

“หมายถึงความสัมพันธ์ที่เป็นแบบ one-to-many ที่ขึ้นตรงต่อกันระหว่าง object กับ object และเมื่อใดที่ object เปลี่ยนสถานะ object ที่ขึ้นตรงต่อกันจะทำการปรับเปลี่ยนและแจ้งเตือนโดยอัตโนมัติ”

null

อันนี้เป็นโครงสร้างมาตรฐานครับที่เขียนให้ดูในรูปแบบ UML Class diagram  กระบวนการทำงานนั้นก็ง่ายครับแบบที่ผู้ยกตัวอย่างไปด้านบนก่อนหน้านี้ ถ้ามีคนเขามาแล้วทำการลงทะเบียนเพื่อขอรับข่าวจากเราคือ Subject ในตัวของ attach() ก็จะทำงาน และเมื่อไรที่ฝั่งที่มีหน้าที่อัพเดทข่าวทำการเปลี่ยนแปลงหรือเพิ่มข้อมูลลงไป notify() ก็จะส่งข้อความไปเรียกให้ update() ของแต่ละผู้รับ (Observers) ทำงาน อัตโนมัติ
null

เดียวเรามาลองเขียนโค้ดกันดูเลยดีกว่า ครับสำรับในภาษา java นั้นจะมี API ตัวนึงที่ใช้สำหรับทำ Observers ให้อยู่แล้วคือ  java.util.Observable; java.util.Observer; ซึ่งเราสามารถที่จะ สืบทอดคลาส และ Override Method ได้ครับ

null

กระบวนการง่ายๆ คือมีผู้ที่สนใจรับข้อมูลจากเราเขาก็จะเข้ามาลงทะเบียนกับเราจากนั้นจะมีเรทความสนใจเมื่อผู้รับลงทะเบียนไปเราก็จะนำเรทไปอัพเดทของแต่ละคน จากนั้นก็ทำการแจ้งเตือนเตือนเหตุการณ์ออกมาทันที โดยเราจะเก็บข้อมูลเข้าไว้ใน ArrayList ลองดูครับไม่ยาก

[sourcecode language=”java” wraplines=”false” collapse=”false”]
public interface Observer {
public void update(String operation, String record);
}
[/sourcecode]

 

[sourcecode language=”java” wraplines=”false” collapse=”false”] public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
[/sourcecode]

 

[sourcecode language=”java” wraplines=”false” collapse=”false”]
import java.util.*;

public class Observ implements Subject{
private Vector<Observer> observers;

public Observ(){
observers = new Vector<Observer>();
}

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

@Override
public void removeObserver(Observer o){
observers.remove(o);
}

@Override
public void notifyObservers(){
for (int i= 0; i&lt; observers.size(); i++)
Observer observer = (Observer)observers.get(i);
observer.update(operation, record);
}
}

public void editRecord(String operation, String record){
this.operation = operation;
this.record = record;
notifyObservers();
}
[/sourcecode]

อ้างอิง:java.dzone.com, javarevisited.blogspot.com, dummies.com

Facebook Comments