อ็อบเซิร์ฟเวอร์แพตเทิร์น
จากวิกิพีเดีย สารานุกรมเสรี
อ็อบเซิร์ฟเวอร์แพตเทิร์น (observer pattern หรือเรียกอีกชื่อว่า พับลิช/ซับสไครบ์ publish/subscribe) เป็นดีไซน์แพตเทิร์นที่ใช้แจ้งเหตุการณ์หรือข้อมูลข่าวสารจากคลาสต้นกำเนิดไปยังคลาสที่สมัครเป็นผู้รับข่าวสาร ตัวอย่างที่เด่นชัดได้แก่การสมัครเป็นสมาชิกรับหนังสือพิมพ์หรือนิตยสาร
สารบัญ |
[แก้] การนำไปใช้งาน
โครงสร้างของอ็อบเซิร์ฟเวอร์แพตเทิร์นมีส่วนหลักสองส่วนคือผู้ส่งสารและผู้รับสาร
ผู้ส่งสารมีเมธอดหลักคือเมธอดสำหรับเพิ่มและลดผู้รับสาร และเมธอดสำหรับส่งสารไปยังผู้บอกรับข่าวสารทั้งหมด จากตัวอย่างคลาสไดอะแกรมอินเตอร์เฟส Publisher และคลาส NewspaperPublisher มีเมธอด subscribe(), remove() และ publish() ตามลำดับ
ส่วนผู้รับสารจะต้องมีเมธอดสำหรับที่ผู้ส่งสารใช้เรียกเมื่อต้องการส่งข่าวสาร จากคลาสไดอะแกรมอินเตอร์เฟส Subscriber และคลาส Reader มีเมธอด receive() ที่ Publisher เรียกใช้เมื่อต้องการส่งข่าวสาร
[แก้] ตัวอย่างโปรแกรม
[แก้] ภาษาจาวา
ตัวอย่างโปรแกรมจำลองการทำงานของผู้พิมพ์หนังสือพิมพ์และผู้รับหนังสือพิมพ์ที่มีการทำงานในแบบอ็อบเซิร์ฟเวอร์แพตเทิร์น
อินเตอร์เฟส Publisher
public interface Publisher { public void subscribe(Subscriber subscriber); public void remove(Subscriber subscriber); public void publish(); }
คลาส NewspaperPublisher
public class NewspaperPublisher implements Publisher { private ArrayList<Subscriber> subscribers = new ArrayList<Subscriber>(); public void subscribe(Subscriber subscriber) { subscribers.add(subscriber); } public void remove(Subscriber subscriber) { subscribers.remove(subscriber); } public void publish() { Publication pub = new Newspaper(); for (Subscriber subscriber : subscribers) { subscriber.receive(pub); } } }
อินเตอร์เฟส Subscriber
public interface Subscriber { public void receive(Publication publication); }
คลาส Reader
public class Reader implements Subscriber { private String name; public Reader(String name) { this.name = name; } public void receive(Publication publication) { System.out.println(name + " received " + publication); } }
การเรียกใช้งาน
public class PublishSubscribeTest { public static void main(String[] args) { Reader reader1 = new Reader("reader 1"); Reader reader2 = new Reader("reader 2"); Publisher publisher = new NewspaperPublisher(); publisher.subscribe(reader1); publisher.subscribe(reader2); publisher.publish(); } }
ผลการรัน
reader 1 received Newspaper@6b97fd reader 2 received Newspaper@6b97fd
[แก้] อ้างอิง
- Design Patterns: Elements of Reusable Object-Oriented Software (ISBN 0-201-63361-2) โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)
[แก้] แหล่งข้อมูลอื่น
- An inside view of Observer โดย David Geary ((อังกฤษ))