แบบแผนผู้สังเกต

แบบแผนผู้สังเกต (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  โดย David Geary 

หมวดหมู่:การเขียนโปรแกรม