รูปแบบผู้สังเกตการณ์เป็นรูปแบบการออกแบบเชิงพฤติกรรม การใช้รูปแบบ Observer คือเมื่อคุณสนใจสถานะของวัตถุและต้องการรับการแจ้งเตือนทุกครั้งที่มีการเปลี่ยนแปลง ในรูปแบบผู้สังเกต วัตถุที่สังเกตสถานะของวัตถุอื่นเรียกว่าผู้สังเกตการณ์ และวัตถุที่สังเกตเรียกว่าประธาน ตามกฎของ GoF จุดประสงค์ของรูปแบบผู้สังเกตการณ์คือ:
คัดลอกรหัสรหัสดังต่อไปนี้:
กำหนดความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างออบเจ็กต์ หากสถานะของออบเจ็กต์เปลี่ยนแปลง ออบเจ็กต์ที่เกี่ยวข้องอื่นๆ จะได้รับแจ้งและอัปเดตโดยอัตโนมัติ
ตัวอย่างประกอบด้วยผู้สังเกตการณ์ที่ต้องได้รับแจ้งเมื่อสถานะเปลี่ยนแปลง ดังนั้นจึงควรจัดให้มีวิธีการลงทะเบียนตนเองและยกเลิกการลงทะเบียนตนเองแก่ผู้สังเกตการณ์ เมื่อวัตถุ (สังเกตพบ) เปลี่ยนแปลง จะต้องมีวิธีการแจ้งผู้สังเกตการณ์ทั้งหมดด้วย เมื่อแจ้งผู้สังเกตการณ์ คุณสามารถพุชการอัพเดตหรือระบุวิธีการอื่นในการรับการอัพเดตได้
ผู้สังเกตการณ์ควรมีวิธีการที่ตั้งค่าวัตถุผู้สังเกตการณ์และสามารถใช้เพื่อแจ้งเตือนการอัปเดตได้
JAVA จัดเตรียมวิธีการในตัวเพื่อใช้รูปแบบผู้สังเกตการณ์ อินเทอร์เฟซ java.util.Observable และ java.util.Observer อย่างไรก็ตาม ยังไม่มีการใช้กันอย่างแพร่หลายมากนัก เนื่องจากการใช้งานนี้ง่ายเกินไป โดยส่วนใหญ่แล้วเราไม่ต้องการให้คลาสขยายสุดท้ายใช้เพียงรูปแบบผู้สังเกตการณ์ เนื่องจากคลาส JAVA ไม่สามารถสืบทอดได้หลายครั้ง
เซอร์วิสข้อความ Java Messages Service (JMS) ใช้โหมดผู้สังเกตการณ์และโหมดคำสั่งเพื่อให้ทราบถึงการเผยแพร่และการสมัครสมาชิกข้อมูลระหว่างโปรแกรมต่างๆ
กรอบงานการควบคุมโมเดลมุมมอง MVC ยังใช้รูปแบบผู้สังเกตการณ์ โดยถือว่าโมเดลเป็นผู้สังเกตและมุมมองในฐานะผู้สังเกตการณ์ มุมมองสามารถลงทะเบียนตัวเองกับโมเดลเพื่อรับการเปลี่ยนแปลงในโมเดลได้
ตัวอย่างรูปแบบผู้สังเกตการณ์
ในตัวอย่างนี้ เราจะเสร็จสิ้นการอภิปรายหัวข้อง่ายๆ และผู้สังเกตการณ์สามารถลงทะเบียนสำหรับหัวข้อนี้ได้ การเปลี่ยนแปลงใดๆ ที่เกิดจากการส่งเนื้อหาในหัวข้อนี้จะได้รับการแจ้งไปยังผู้สังเกตการณ์ที่ลงทะเบียนทุกคน
ขึ้นอยู่กับความต้องการของผู้สังเกตการณ์ของเรื่อง นี่คือการใช้อินเทอร์เฟซหัวเรื่องพื้นฐาน อินเทอร์เฟซนี้ระบุชุดของวิธีการเฉพาะที่จำเป็นต้องนำไปใช้ในคลาสเฉพาะที่นำอินเทอร์เฟซไปใช้ในภายหลัง
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.journaldev.design.observer;
ส่วนต่อประสานสาธารณะเรื่อง {
//วิธีการลงทะเบียนและยกเลิกการลงทะเบียนผู้สังเกตการณ์
การลงทะเบียนโมฆะสาธารณะ (Observer obj);
โมฆะสาธารณะยกเลิกการลงทะเบียน (Observer obj);
//วิธีการแจ้งผู้สังเกตการณ์ถึงการเปลี่ยนแปลง
โมฆะสาธารณะแจ้งผู้สังเกตการณ์ ();
//วิธีการรับการอัพเดตจากหัวเรื่อง
วัตถุสาธารณะ getUpdate (ผู้สังเกตการณ์ obj);
-
ตอนนี้สร้างผู้สังเกตการณ์ที่เกี่ยวข้อง จำเป็นต้องมีวิธีการแนบหัวเรื่องกับผู้สังเกตการณ์ วิธีการเพิ่มเติมสามารถรับการแจ้งเตือนการเปลี่ยนหัวเรื่องได้
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.journaldev.design.observer;
ผู้สังเกตการณ์อินเทอร์เฟซสาธารณะ {
//วิธีการอัพเดตผู้สังเกตการณ์ที่ใช้โดยหัวเรื่อง
การอัปเดตโมฆะสาธารณะ ();
//แนบกับเรื่องที่จะสังเกต
โมฆะสาธารณะ setSubject (หัวเรื่องย่อย);
-
การเชื่อมต่อนี้ถูกสร้างขึ้นแล้ว ตอนนี้ใช้ธีมที่เป็นรูปธรรม
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.journaldev.design.observer;
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
MyTopic ระดับสาธารณะดำเนินการเรื่อง {
ผู้สังเกตการณ์รายการส่วนตัว <ผู้สังเกตการณ์>;
ข้อความสตริงส่วนตัว
บูลีนส่วนตัวเปลี่ยนไป
วัตถุสุดท้ายส่วนตัว MUTEX= วัตถุใหม่ ();
MyTopic สาธารณะ () {
this.observers=new ArrayList<>();
-
@แทนที่
การลงทะเบียนโมฆะสาธารณะ (Observer obj) {
ถ้า (obj == null) โยน NullPointerException ใหม่ ("Null Observer");
if(!observers.contains(obj)) ผู้สังเกตการณ์.เพิ่ม(obj);
-
@แทนที่
โมฆะสาธารณะยกเลิกการลงทะเบียน (Observer obj) {
ผู้สังเกตการณ์ ลบ (obj);
-
@แทนที่
โมฆะสาธารณะแจ้งผู้สังเกตการณ์ () {
รายการผู้สังเกตการณ์ <ผู้สังเกตการณ์>Local = null;
//การซิงโครไนซ์ถูกใช้เพื่อให้แน่ใจว่าผู้สังเกตการณ์ที่ลงทะเบียนหลังจากได้รับข้อความจะไม่ได้รับแจ้ง
ซิงโครไนซ์ (MUTEX) {
ถ้า (!เปลี่ยน)
กลับ;
ผู้สังเกตการณ์Local = ใหม่ ArrayList<>(this.observers);
this.changed=false;
-
สำหรับ (ผู้สังเกตการณ์ obj: ผู้สังเกตการณ์ท้องถิ่น) {
obj.อัพเดต();
-
-
@แทนที่
วัตถุสาธารณะ getUpdate (ผู้สังเกตการณ์ obj) {
กลับข้อความนี้;
-
//วิธีการโพสต์ข้อความในหัวข้อ
postMessage โมฆะสาธารณะ (ข้อความสตริง) {
System.out.println("ข้อความที่โพสต์ไปที่หัวข้อ:"+msg);
this.message=msg;
นี้.changed=true;
แจ้งผู้สังเกตการณ์ ();
-
-
การดำเนินการลงทะเบียนและยกเลิกการลงทะเบียนวิธีการนั้นง่ายมาก ลูกค้าจะใช้เมธอดเพิ่มเติม postMessage() เพื่อส่งข้อความสตริงไปยังหัวข้อนี้ โปรดทราบว่าตัวแปรบูลีนใช้เพื่อติดตามการเปลี่ยนแปลงในสถานะหัวข้อและแจ้งให้ผู้สังเกตการณ์ทราบถึงการเปลี่ยนแปลงดังกล่าว ตัวแปรนี้มีความจำเป็นเนื่องจากหากไม่มีการอัปเดต แต่มีคนเรียกใช้เมธอด notifyObservers() เขาจะไม่สามารถส่งข้อมูลการแจ้งเตือนข้อผิดพลาดไปยังผู้สังเกตการณ์ได้
นอกจากนี้ ควรสังเกตว่ามีการใช้การซิงโครไนซ์ใน notifyObservers() เพื่อให้แน่ใจว่าการแจ้งเตือนสามารถส่งไปยังผู้สังเกตการณ์ที่ลงทะเบียนไว้เท่านั้นก่อนที่ข้อความจะถูกเผยแพร่ในหัวข้อ
นี่คือการดำเนินการของผู้สังเกตการณ์ พวกเขาจะเน้นไปที่วัตถุเป้าหมายเสมอ
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.journaldev.design.observer;
MyTopicSubscriber คลาสสาธารณะใช้งาน Observer {
ชื่อสตริงส่วนตัว
หัวข้อเรื่องส่วนตัว
MyTopicSubscriber สาธารณะ (สตริงนาโนเมตร) {
this.name=นาโนเมตร;
-
@แทนที่
การอัปเดตโมฆะสาธารณะ () {
String msg = (String) topic.getUpdate(สิ่งนี้);
ถ้า(msg==null){
System.out.println(name+":: ไม่มีข้อความใหม่");
}อื่น
System.out.println(name+":: การใช้ข้อความ::"+msg);
-
@แทนที่
โมฆะสาธารณะ setSubject (หัวข้อย่อย) {
this.topic=ย่อย;
-
-
โปรดทราบว่าการใช้งานเมธอด update() จะใช้ getUpdate() ของผู้สังเกตการณ์เพื่อจัดการกับข้อความที่อัปเดต ควรหลีกเลี่ยงการส่งข้อความเป็นพารามิเตอร์ไปยังเมธอด update() ที่นี่
นี่คือโปรแกรมทดสอบง่ายๆ เพื่อตรวจสอบการใช้งานคลาสหัวข้อ
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.journaldev.design.observer;
ObserverPatternTest ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
//สร้างเรื่อง
หัวข้อ MyTopic = MyTopic ใหม่();
//สร้างผู้สังเกตการณ์
ผู้สังเกตการณ์ obj1 = MyTopicSubscriber ใหม่ ("Obj1");
ผู้สังเกตการณ์ obj2 = MyTopicSubscriber ใหม่ ("Obj2");
ผู้สังเกตการณ์ obj3 = MyTopicSubscriber ใหม่ ("Obj3");
//ลงทะเบียนผู้สังเกตการณ์ไปยังเรื่อง
หัวข้อ.ลงทะเบียน(obj1);
หัวข้อ.ลงทะเบียน(obj2);
หัวข้อ.ลงทะเบียน(obj3);
//แนบผู้สังเกตการณ์เข้ากับเรื่อง
obj1.setSubject (หัวข้อ);
obj2.setSubject (หัวข้อ);
obj3.setSubject(หัวข้อ);
//ตรวจสอบว่ามีการอัพเดตใด ๆ หรือไม่
obj1.อัพเดต();
//ตอนนี้ส่งข้อความไปที่หัวเรื่อง
topic.postMessage("ข้อความใหม่");
-
-
นี่คือผลลัพธ์ข้างต้น:
คัดลอกรหัสรหัสดังต่อไปนี้:
Obj1:: ไม่มีข้อความใหม่
ข้อความที่โพสต์ในหัวข้อ:ข้อความใหม่
Obj1::การบริโภคข้อความ::ข้อความใหม่
Obj2::ข้อความการบริโภค::ข้อความใหม่
Obj3::ข้อความการบริโภค::ข้อความใหม่</pre>
แผนภาพ UML ของรูปแบบผู้สังเกตการณ์
รูปแบบผู้สังเกตการณ์เรียกอีกอย่างว่ารูปแบบการเผยแพร่และสมัครสมาชิก แอปพลิเคชั่นเฉพาะบางตัวใน JAVA มีดังนี้:
1.java.util.EventListener ในสวิง
2.javax.servlet.http.HttpSessionBindingListener
3.javax.servlet.http.HttpSessionAttributeListener
ด้านบนนี้เป็นโหมดผู้สังเกตการณ์ทั้งหมด หวังว่าคุณจะชอบมันแล้ว แบ่งปันความรู้สึกของคุณในความคิดเห็นหรือโปรดแบ่งปันกับผู้อื่น