แบบแผนผู้สังเกต
แบบแผนผู้สังเกต (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
import java.util.ArrayList;
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() {
Publisher pub = new NewspaperPublisher();
for (Subscriber subscriber : subscribers) {
subscriber.receive(pub);
}
}
}
อินเตอร์เฟส Subscriber
public interface Subscriber {
public void receive(Publisher publication);
}
คลาส Reader
public class Reader implements Subscriber {
private String name;
public Reader(String name) {
this.name = name;
}
public void receive(Publisher 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 NewspaperPublisher@6b97fd reader 2 received NewspaperPublisher@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 เก็บถาวร 2007-02-07 ที่ เวย์แบ็กแมชชีน โดย David Geary (อังกฤษ)