อ็อบเซิร์ฟเวอร์แพตเทิร์น

จากวิกิพีเดีย สารานุกรมเสรี

อ็อบเซิร์ฟเวอร์แพตเทิร์น (observer pattern หรือเรียกอีกชื่อว่า พับลิช/ซับสไครบ์ publish/subscribe) เป็นดีไซน์แพตเทิร์นที่ใช้แจ้งเหตุการณ์หรือข้อมูลข่าวสารจากคลาสต้นกำเนิดไปยังคลาสที่สมัครเป็นผู้รับข่าวสาร ตัวอย่างที่เด่นชัดได้แก่การสมัครเป็นสมาชิกรับหนังสือพิมพ์หรือนิตยสาร

สารบัญ

[แก้] การนำไปใช้งาน

โครงสร้างของอ็อบเซิร์ฟเวอร์แพตเทิร์นมีส่วนหลักสองส่วนคือผู้ส่งสารและผู้รับสาร

ผู้ส่งสารมีเมธอดหลักคือเมธอดสำหรับเพิ่มและลดผู้รับสาร และเมธอดสำหรับส่งสารไปยังผู้บอกรับข่าวสารทั้งหมด จากตัวอย่างคลาสไดอะแกรมอินเตอร์เฟส Publisher และคลาส NewspaperPublisher มีเมธอด subscribe(), remove() และ publish() ตามลำดับ

ส่วนผู้รับสารจะต้องมีเมธอดสำหรับที่ผู้ส่งสารใช้เรียกเมื่อต้องการส่งข่าวสาร จากคลาสไดอะแกรมอินเตอร์เฟส Subscriber และคลาส Reader มีเมธอด receive() ที่ Publisher เรียกใช้เมื่อต้องการส่งข่าวสาร

คลาสไดอะแกรมของอ็อบเซิร์ฟเวอร์แพตเทิร์น ในแบบ UML
คลาสไดอะแกรมของอ็อบเซิร์ฟเวอร์แพตเทิร์น ในแบบ UML


[แก้] ตัวอย่างโปรแกรม

[แก้] ภาษาจาวา

ตัวอย่างโปรแกรมจำลองการทำงานของผู้พิมพ์หนังสือพิมพ์และผู้รับหนังสือพิมพ์ที่มีการทำงานในแบบอ็อบเซิร์ฟเวอร์แพตเทิร์น

อินเตอร์เฟส 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)

[แก้] แหล่งข้อมูลอื่น