แบบแผนผู้สังเกต (observer pattern หรือเรียกอีกชื่อว่า พับลิช/ซับสไครบ์ publish/subscribe) เป็นแบบแผนการออกแบบซอฟต์แวร์ที่ใช้แจ้งเหตุการณ์หรือข้อมูลข่าวสารจากคลาสต้นกำเนิดไปยังคลาสที่สมัครเป็นผู้รับข่าวสาร ตัวอย่างที่เด่นชัดได้แก่การสมัครเป็นสมาชิกรับหนังสือพิมพ์หรือนิตยสาร
การนำไปใช้งาน
โครงสร้างของแบบแผนผู้สังเกตมีส่วนหลักสองส่วนคือผู้ส่งสารและผู้รับสาร
ผู้ส่งสารมีเมธอดหลักคือเมธอดสำหรับเพิ่มและลดผู้รับสาร และเมธอดสำหรับส่งสารไปยังผู้บอกรับข่าวสารทั้งหมด จากตัวอย่างคลาสไดอะแกรมอินเตอร์เฟส Publisher และคลาส NewspaperPublisher มีเมธอด subscribe(), remove() และ publish() ตามลำดับ
ส่วนผู้รับสารจะต้องมีเมธอดสำหรับที่ผู้ส่งสารใช้เรียกเมื่อต้องการส่งข่าวสาร จากคลาสไดอะแกรมอินเตอร์เฟส Subscriber และคลาส Reader มีเมธอด receive() ที่ Publisher เรียกใช้เมื่อต้องการส่งข่าวสาร
![image](https://www.wiki3.th-th.nina.az/image/aHR0cHM6Ly93d3cud2lraTMudGgtdGgubmluYS5hei9pbWFnZS9hSFIwY0hNNkx5OTFjR3h2WVdRdWQybHJhVzFsWkdsaExtOXlaeTkzYVd0cGNHVmthV0V2ZEdndlpTOWxaQzlQWW5ObGNuWmxjbDl3WVhSMFpYSnVYMk5zWVhOelgyUnBZV2R5WVcwdWFuQm4uanBn.jpg)
ตัวอย่างโปรแกรม
ภาษาจาวา
ตัวอย่างโปรแกรมจำลองการทำงานของผู้พิมพ์หนังสือพิมพ์และผู้รับหนังสือพิมพ์ที่มีการทำงานในแบบแผนผู้สังเกต
อินเตอร์เฟส 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 () โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)
แหล่งข้อมูลอื่น
- An inside view of Observer 2007-02-07 ที่ เวย์แบ็กแมชชีน โดย David Geary (อังกฤษ)
wikipedia, แบบไทย, วิกิพีเดีย, วิกิ หนังสือ, หนังสือ, ห้องสมุด, บทความ, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม, มือถือ, โทรศัพท์, Android, iOS, Apple, โทรศัพท์โมบิล, Samsung, iPhone, Xiomi, Xiaomi, Redmi, Honor, Oppo, Nokia, Sonya, MI, PC, พีซี, web, เว็บ, คอมพิวเตอร์
aebbaephnphusngekt observer pattern hruxeriykxikchuxwa phblich sbsikhrb publish subscribe epnaebbaephnkarxxkaebbsxftaewrthiichaecngehtukarnhruxkhxmulkhawsarcakkhlastnkaenidipyngkhlasthismkhrepnphurbkhawsar twxyangthiednchdidaekkarsmkhrepnsmachikrbhnngsuxphimphhruxnitysarkarnaipichnganokhrngsrangkhxngaebbaephnphusngektmiswnhlksxngswnkhuxphusngsaraelaphurbsar phusngsarmiemthxdhlkkhuxemthxdsahrbephimaelaldphurbsar aelaemthxdsahrbsngsaripyngphubxkrbkhawsarthnghmd caktwxyangkhlasidxaaekrmxinetxrefs Publisher aelakhlas NewspaperPublisher miemthxd subscribe remove aela publish tamladb swnphurbsarcatxngmiemthxdsahrbthiphusngsaricheriykemuxtxngkarsngkhawsar cakkhlasidxaaekrmxinetxrefs Subscriber aelakhlas Reader miemthxd receive thi Publisher eriykichemuxtxngkarsngkhawsar khlasidxaaekrmkhxngaebbaephnphusngekt inaebb UMLtwxyangopraekrmphasacawa twxyangopraekrmcalxngkarthangankhxngphuphimphhnngsuxphimphaelaphurbhnngsuxphimphthimikarthanganinaebbaephnphusngekt xinetxrefs Publisher public interface Publisher public void subscribe Subscriber subscriber public void remove Subscriber subscriber public void publish khlas NewspaperPublisher import java util ArrayList public class NewspaperPublisher implements Publisher private ArrayList lt Subscriber gt subscribers new ArrayList lt Subscriber gt 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 xinetxrefs Subscriber public interface Subscriber public void receive Publisher publication khlas 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 kareriykichngan 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 phlkarrn reader 1 received NewspaperPublisher 6b97fd reader 2 received NewspaperPublisher 6b97fdxangxingDesign Patterns Elements of Reusable Object Oriented Software ISBN 0 201 63361 2 ody Erich Gamma Richard Helm Ralph Johnson aela John Vlissides Gang of four GoF aehlngkhxmulxunAn inside view of Observer 2007 02 07 thi ewyaebkaemchchin ody David Geary xngkvs