โหมด Observer (บางครั้งเรียกว่าโหมด Publish-Subscribe, โหมดมุมมองแบบจำลอง, โหมด Source-Listener หรือโหมด Slave) เป็นโหมดการออกแบบซอฟต์แวร์ประเภทหนึ่ง ในโหมดนี้วัตถุเป้าหมายจัดการวัตถุผู้สังเกตการณ์ทั้งหมดที่ขึ้นอยู่กับมันและออกการแจ้งเตือนอย่างแข็งขันเมื่อสถานะเปลี่ยนแปลง โดยปกติจะทำได้โดยการเรียกใช้วิธีการของผู้สังเกตการณ์แต่ละคน รูปแบบนี้มักจะใช้ในการใช้ระบบประมวลผลเหตุการณ์
โหมดผู้สังเกตการณ์ แยกผู้สังเกตการณ์ออกจากวัตถุที่สังเกตได้อย่างสมบูรณ์ ตัวอย่างเช่นอินเทอร์เฟซผู้ใช้สามารถใช้เป็นผู้สังเกตการณ์และข้อมูลทางธุรกิจเป็นผู้สังเกตการณ์ ส่วนต่อประสานผู้ใช้สังเกตการเปลี่ยนแปลงข้อมูลธุรกิจ หลังจากค้นพบการเปลี่ยนแปลงของข้อมูลมันจะปรากฏบนอินเทอร์เฟซ หลักการหนึ่งของการออกแบบเชิงวัตถุคือแต่ละคลาสในระบบจะมุ่งเน้นไปที่ฟังก์ชั่นเดียวไม่ใช่ด้านอื่น ๆ คนทำเพียงสิ่งเดียวและทำได้ดี โหมดผู้สังเกตการณ์ดึงขอบเขตที่ชัดเจนระหว่างโมดูลปรับปรุงการบำรุงรักษาและความสามารถในการใช้ซ้ำของแอปพลิเคชัน
รูปแบบการออกแบบผู้สังเกตการณ์กำหนดการพึ่งพาแบบหนึ่งถึงหลายคนระหว่างวัตถุดังนั้นเมื่อสถานะของวัตถุเปลี่ยนแปลงวัตถุทั้งหมดที่ขึ้นอยู่กับมันจะได้รับแจ้งและรีเฟรชโดยอัตโนมัติ
วิธีการดำเนินการ:
มีหลายวิธีในการใช้รูปแบบผู้สังเกตการณ์และพื้นฐานรูปแบบจะต้องมีสองบทบาท: ผู้สังเกตการณ์และวัตถุที่ถูกสังเกต ในตัวอย่างตอนนี้ข้อมูลทางธุรกิจเป็นวัตถุที่จะสังเกตและอินเทอร์เฟซผู้ใช้คือผู้สังเกตการณ์ มีความสัมพันธ์เชิงตรรกะระหว่างผู้สังเกตการณ์และผู้สังเกตการณ์ เมื่อผู้สังเกตการณ์เปลี่ยนแปลงผู้สังเกตการณ์จะสังเกตการเปลี่ยนแปลงดังกล่าวและตอบสนองตามนั้น หากกระบวนการสังเกตดังกล่าวถูกใช้ระหว่างส่วนต่อประสานผู้ใช้และข้อมูลทางธุรกิจก็สามารถมั่นใจได้ว่าขอบเขตระหว่างอินเทอร์เฟซและข้อมูลจะถูกวาด สมมติว่าความต้องการของแอปพลิเคชันมีการเปลี่ยนแปลงประสิทธิภาพของอินเทอร์เฟซจะต้องได้รับการแก้ไข เฉพาะส่วนต่อประสานผู้ใช้เท่านั้นที่จะต้องได้รับการสร้างขึ้นใหม่และข้อมูลทางธุรกิจไม่จำเป็นต้องเปลี่ยนแปลง
1. ผู้สังเกตการณ์
(ผู้สังเกตการณ์) ลงทะเบียนตัวเองในเรื่องและวัตถุที่สังเกตได้เก็บผู้สังเกตการณ์ไว้ในภาชนะ
2. ถูกสังเกต
วัตถุที่ถูกสังเกตมีการเปลี่ยนแปลงบางอย่าง (ดังที่แสดงใน somechange ในรูป) และผู้สังเกตการณ์ที่ลงทะเบียนทั้งหมดได้มาจากคอนเทนเนอร์และแจ้งผู้สังเกตการณ์ของการเปลี่ยนแปลง
3. เพิกถอนการสังเกต
ผู้สังเกตการณ์บอกให้ผู้สังเกตการณ์ยกเลิกการสังเกตและลบผู้สังเกตการณ์ออกจากคอนเทนเนอร์
เมื่อผู้สังเกตการณ์ลงทะเบียนตัวเองลงในคอนเทนเนอร์ของผู้สังเกตการณ์ผู้สังเกตการณ์ไม่ควรถามเกี่ยวกับประเภทเฉพาะของผู้สังเกตการณ์ แต่ควรใช้อินเทอร์เฟซของผู้สังเกตการณ์ ข้อได้เปรียบนี้คือ: สมมติว่ามีผู้สังเกตการณ์คนอื่น ๆ ในโปรแกรมตราบใดที่ผู้สังเกตการณ์นี้ถูกนำไปใช้โดยอินเทอร์เฟซเดียวกัน บุคคลที่ถูกสังเกตสามารถสอดคล้องกับผู้สังเกตการณ์หลายคน เมื่อบุคคลที่ถูกสังเกตเห็นการเปลี่ยนแปลงเขาสามารถแจ้งผู้สังเกตการณ์ทุกคนทีละคน ขึ้นอยู่กับอินเทอร์เฟซไม่ใช่การใช้งานที่เฉพาะเจาะจง - นี้ให้ความยืดหยุ่นมากขึ้นสำหรับโปรแกรม
รหัสสาธิต:
กำหนดบทบาทนามธรรมที่จะสังเกต:
การทดสอบแพ็คเกจ. edu.mainrole; นำเข้า java.util.arraylist; บทคัดย่อระดับสาธารณะ Absrole {Private ArrayList <IobServer> list = new ArrayList <Iobserver> (); โมฆะสาธารณะเพิ่ม (ผู้สังเกตการณ์ iobserver) {list.add (ผู้สังเกตการณ์); } โมฆะสาธารณะ DELETE (IOBServer Observer) {list.remove (Observer); } โมฆะสาธารณะ nodifyobservers (String newState) {สำหรับ (iObserver Observer: list) {observer.update (NewState); - Subclass บทบาทที่สังเกตได้:
การทดสอบแพ็คเกจ. edu.mainrole; บทบาทระดับสาธารณะขยาย absrole {สถานะสตริงส่วนตัว; สตริงสาธารณะ getState () {return state; } การเปลี่ยนแปลงโมฆะสาธารณะ (สตริง nupdate) {state = nupdate; this.nodifyobservers (รัฐ); - กำหนดอินเทอร์เฟซ Observer:
การทดสอบแพ็คเกจ. edu.mainrole; อินเทอร์เฟซสาธารณะ iobserver {การอัปเดตโมฆะสาธารณะ (สตริงนิวสเตต); - ผู้สังเกตการณ์เฉพาะ:
การทดสอบแพ็คเกจ. edu.mainrole; Public Class ObserverObj1 ใช้ iobserver {สตริงส่วนตัวสังเกตการณ์; @Override การอัปเดตโมฆะสาธารณะ (สถานะสตริง) {ObservERSTATE = State; System.out.println ("สถานะของผู้สังเกตการณ์ 1 คือ:" + สังเกตการณ์); - การทดสอบแพ็คเกจ. edu.mainrole; Public Class Observerobj2 ใช้ iobserver {สตริงส่วนตัวสังเกตการณ์; @Override การอัปเดตโมฆะสาธารณะ (สถานะสตริง) {ObservERSTATE = State; System.out.println ("สถานะของ Observer 2 คือ:" + สังเกตการณ์); - ทดสอบไคลเอนต์:
การทดสอบแพ็คเกจ. edu.mainrole; ไคลเอนต์คลาสสาธารณะ { / ** * @param args * / โมฆะคงที่สาธารณะหลัก (String [] args) {บทบาทบทบาท = บทบาทใหม่ (); iobserver observer1 = New Observerobj1 (); iobserver observer2 = ใหม่ observerobj2 (); subject.add (observer1); subject.add (observer2); SUBJECT.CHANGE ("UPDATE!"); - ผลการทำงาน:
สถานะของผู้สังเกตการณ์ 1 คือ: อัปเดต! สถานะของผู้สังเกตการณ์ 2 คือ: อัปเดต!
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้และฉันหวังว่ามันจะเป็นแรงบันดาลใจให้คุณเรียนรู้