คำจำกัดความ: กำหนดการพึ่งพาแบบหนึ่งถึงหลายคนระหว่างวัตถุดังนั้นเมื่อแต่ละวัตถุเปลี่ยนสถานะของมันวัตถุทั้งหมดที่ขึ้นอยู่กับมันจะได้รับการแจ้งและอัปเดตโดยอัตโนมัติ
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
มักจะมีความต้องการในระบบซอฟต์แวร์: หากสถานะของวัตถุเปลี่ยนแปลงวัตถุบางอย่างที่เกี่ยวข้องกับมันก็จะเปลี่ยนไปตามนั้น ตัวอย่างเช่นเราต้องการออกแบบฟังก์ชั่นเมนูคลิกขวา ตราบใดที่เราคลิกขวาในพื้นที่ที่มีประสิทธิภาพของซอฟต์แวร์เมนูจะปรากฏขึ้น ตัวอย่างเช่นเราต้องการออกแบบฟังก์ชั่นการปรับใช้อัตโนมัติเช่นเดียวกับเมื่อ Eclipse ได้รับการพัฒนาตราบใดที่ไฟล์ได้รับการแก้ไข Eclipse จะปรับใช้ไฟล์ที่แก้ไขโดยอัตโนมัติไปยังเซิร์ฟเวอร์ มีความคล้ายคลึงกันระหว่างฟังก์ชั่นทั้งสองนี้นั่นคือวัตถุหนึ่งจะต้องตรวจสอบวัตถุอื่นเสมอและตราบใดที่สถานะการเปลี่ยนแปลงของมันจะดำเนินการที่สอดคล้องกัน ในความเป็นจริงมีวิธีแก้ปัญหามากมายที่สามารถบรรลุเป้าหมายนี้ได้ แต่การใช้โมเดลผู้สังเกตการณ์นั้นเป็นทางเลือกที่สำคัญอย่างไม่ต้องสงสัย
โครงสร้างของรูปแบบผู้สังเกตการณ์
ในโหมดผู้สังเกตการณ์ขั้นพื้นฐานที่สุดจะรวมอักขระสี่ตัวต่อไปนี้ไว้แล้ว:
ผู้สังเกตการณ์: จากไดอะแกรมคลาสคุณจะเห็นว่ามีภาชนะเวกเตอร์ในคลาสที่เก็บวัตถุผู้สังเกตการณ์ (เหตุผลที่ใช้เวกเตอร์แทนรายการเป็นเพราะเมื่อการดำเนินการแบบหลายเธรดเวกเตอร์ปลอดภัยในขณะที่รายการไม่ปลอดภัย) ภาชนะเวกเตอร์นี้เป็นแกนหลักของคลาสผู้สังเกตการณ์ มีสามวิธีอื่น ๆ : วิธีการแนบคือการเพิ่มวัตถุผู้สังเกตการณ์ลงในคอนเทนเนอร์นี้ วิธีการถอดคือการลบวัตถุผู้สังเกตการณ์ออกจากคอนเทนเนอร์ วิธีการแจ้งเตือนคือการเรียกวิธีการที่สอดคล้องกันของวัตถุผู้สังเกตการณ์ในทางกลับกัน บทบาทนี้อาจเป็นอินเทอร์เฟซคลาสนามธรรมหรือคลาสคอนกรีตเนื่องจากในหลายกรณีมันจะผสมกับรูปแบบอื่น ๆ ดังนั้นจึงมีกรณีที่ใช้คลาสนามธรรมมากขึ้น
ผู้สังเกตการณ์: บทบาทผู้สังเกตการณ์โดยทั่วไปเป็นอินเทอร์เฟซซึ่งมีวิธีการอัปเดตเพียงวิธีเดียว เมื่อสถานะของผู้สังเกตการณ์เปลี่ยนแปลงวิธีนี้จะถูกเรียก
ผู้สังเกตการณ์เฉพาะ: บทบาทนี้ใช้เพื่อการขยายตัวที่ง่ายและตรรกะทางธุรกิจเฉพาะสามารถกำหนดได้ในบทบาทนี้
ผู้สังเกตการณ์เฉพาะ: การใช้งานเฉพาะของอินเตอร์เฟสผู้สังเกตการณ์ ในบทบาทนี้ตรรกะที่จะประมวลผลเมื่อสถานะของวัตถุที่ถูกสังเกตเห็นการเปลี่ยนแปลง
ตัวอย่างการใช้โหมดผู้สังเกตการณ์
อินเทอร์เฟซเรื่อง
หัวเรื่องสาธารณะ {โมฆะสาธารณะ registerobserver (Observer o); โมฆะสาธารณะ RemoveObserver (Observer O); โมฆะสาธารณะ NotifyAllobServers ();}อินเทอร์เฟซผู้สังเกตการณ์
ผู้สังเกตการณ์ส่วนต่อประสานสาธารณะ {การอัปเดตโมฆะสาธารณะ (หัวเรื่อง s);}คลาส Hunter ใช้อินเทอร์เฟซเรื่อง
นำเข้า java.util.arraylist; Public Class Headhunter ใช้หัวเรื่อง {// กำหนดรายชื่อผู้ใช้เช่น Mike, Bill, ฯลฯ ArrayList ส่วนตัว <Ebserver> Userlist; arraylist ส่วนตัว <String> งาน; Public Headhunter () {userlist = new ArrayList <Ebserver> (); Jobs = new ArrayList <String> (); } @Override โมฆะสาธารณะ registerobserver (Observer o) {userlist.add (O); } @Override โมฆะสาธารณะ removeObserver (observer o) {} @Override โมฆะสาธารณะ NotifyOlobServers () {สำหรับ (Observer o: userlist) {o.update (นี่); }} โมฆะสาธารณะ addjob (งานสตริง) {this.jobs.add (Job); NotifyAllobServers (); } arrayList สาธารณะ <String> getJobs () {ส่งคืนงาน; } Public String ToString () {return jobs.toString (); -Jobseeker เป็นผู้สังเกตการณ์:
Jobseeker คลาสสาธารณะใช้ผู้สังเกตการณ์ {ชื่อสตริงส่วนตัว; Public Jobseeker (ชื่อสตริง) {this.name = name; } @Override การอัปเดตโมฆะสาธารณะ (หัวเรื่อง s) {system.out.println (this.name + "ได้รับแจ้ง!"); // พิมพ์รายการงาน System.out.println; -เริ่มต้น:
คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {headhunter hh = new Headhunter (); hh.registerobserver (ใหม่ Jobseeker ("Mike")); hh.registerobserver (ใหม่ Jobseeker ("Chris")); hh.registerobserver (ใหม่ Jobseeker ("Jeff")); // ทุกครั้งที่คุณเพิ่มงานสามารถแจ้งงานทั้งหมดได้ hh.addjob ("Google Job"); hh.addjob ("งาน yahoo"); - ข้อดีของโหมดผู้สังเกตการณ์
ผู้สังเกตการณ์และผู้สังเกตการณ์มีความสัมพันธ์กันเล็กน้อยและเป็นคู่ที่เป็นนามธรรมเพื่อให้สามารถขยายได้ง่ายขึ้นสำหรับทั้งคู่
โหมดผู้สังเกตการณ์เป็นกลไกทริกเกอร์ที่ใช้กันทั่วไปซึ่งก่อให้เกิดโซ่ทริกเกอร์และประมวลผลวิธีการของผู้สังเกตการณ์แต่ละคนในทางกลับกัน แต่ในเวลาเดียวกันนี่ก็เป็นข้อเสียของโหมดผู้สังเกตการณ์ เนื่องจากมันถูกกระตุ้นในห่วงโซ่เมื่อมีผู้สังเกตการณ์จำนวนมากปัญหาประสิทธิภาพจึงเป็นกังวลมากขึ้น ยิ่งไปกว่านั้นในโครงสร้างห่วงโซ่ข้อผิดพลาดการอ้างอิงแบบวงกลมมีแนวโน้มที่จะเกิดขึ้นทำให้ระบบแกล้งทำ
สรุป
ในภาษา Java มีผู้สังเกตการณ์อินเทอร์เฟซและคลาสการใช้งานที่สังเกตได้ซึ่งมักจะใช้บทบาทผู้สังเกตการณ์ เราสามารถดูวิธีการใช้งานของสองคลาสนี้ในเอกสาร JDK API
เพื่อนที่ได้ทำ VC ++, JavaScript Dom หรือ Awt Development ล้วนเป็นเรื่องที่น่าอัศจรรย์เกี่ยวกับการประมวลผลกิจกรรมของพวกเขา หลังจากทำความเข้าใจกับรูปแบบผู้สังเกตการณ์พวกเขามีความเข้าใจบางอย่างเกี่ยวกับหลักการของกลไกการประมวลผลเหตุการณ์ หากคุณต้องการออกแบบฟังก์ชั่นของกลไกการประมวลผลเหตุการณ์การใช้โหมดผู้สังเกตการณ์เป็นตัวเลือกที่ดี การประมวลผลเหตุการณ์ DEM (รูปแบบเหตุการณ์การมอบหมาย) ใน AWT ถูกนำมาใช้โดยใช้โหมดผู้สังเกตการณ์