23 รูปแบบการออกแบบบทที่ 13: รูปแบบผู้สังเกตการณ์ Java
คำจำกัดความ: กำหนดการพึ่งพาแบบหนึ่งถึงหลายคนระหว่างวัตถุดังนั้นเมื่อแต่ละวัตถุเปลี่ยนสถานะของมันวัตถุทั้งหมดที่ขึ้นอยู่กับมันจะได้รับการแจ้งและอัปเดตโดยอัตโนมัติ
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
มักจะมีความต้องการในระบบซอฟต์แวร์: หากสถานะของวัตถุเปลี่ยนแปลงวัตถุบางอย่างที่เกี่ยวข้องกับมันก็จะเปลี่ยนไปตามนั้น
ตัวอย่างเช่นเราต้องการออกแบบฟังก์ชั่นเมนูคลิกขวา ตราบใดที่เราคลิกขวาในพื้นที่ที่มีประสิทธิภาพของซอฟต์แวร์เมนูจะปรากฏขึ้น
ตัวอย่างเช่นเราจำเป็นต้องออกแบบฟังก์ชั่นการปรับใช้อัตโนมัติเช่นเดียวกับเมื่อ Eclipse ได้รับการพัฒนาตราบใดที่ไฟล์ได้รับการแก้ไข Eclipse จะปรับใช้ไฟล์ที่แก้ไขโดยอัตโนมัติไปยังเซิร์ฟเวอร์
มีความคล้ายคลึงกันระหว่างฟังก์ชั่นทั้งสองนี้นั่นคือวัตถุหนึ่งจะต้องตรวจสอบวัตถุอื่นเสมอและตราบใดที่สถานะการเปลี่ยนแปลงของมันจะดำเนินการที่สอดคล้องกัน ในความเป็นจริงมีวิธีแก้ปัญหามากมายที่สามารถบรรลุเป้าหมายนี้ได้ แต่การใช้โมเดลผู้สังเกตการณ์นั้นเป็นทางเลือกที่สำคัญอย่างไม่ต้องสงสัย
โครงสร้างของรูปแบบผู้สังเกตการณ์
ในโหมดผู้สังเกตการณ์ขั้นพื้นฐานที่สุดจะรวมอักขระสี่ตัวต่อไปนี้ไว้แล้ว:
ผู้สังเกตการณ์: จากไดอะแกรมคลาสคุณจะเห็นว่ามีภาชนะเวกเตอร์ในคลาสที่เก็บวัตถุผู้สังเกตการณ์ (เหตุผลที่คุณใช้เวกเตอร์แทนที่จะเป็นรายการเพราะมีมากมาย
เมื่อเธรดเวกเตอร์มีความปลอดภัยในขณะที่รายการไม่ปลอดภัย) คอนเทนเนอร์เวกเตอร์นี้เป็นแกนหลักของคลาสผู้สังเกตการณ์และมีวิธีอื่นอีกสามวิธี: วิธีการแนบคือการเพิ่มวัตถุผู้สังเกตการณ์ลงในคอนเทนเนอร์นี้ วิธีการถอดคือการลบวัตถุผู้สังเกตการณ์ออกจากคอนเทนเนอร์ วิธีการแจ้งเตือนคือการเรียกวิธีการที่สอดคล้องกันของวัตถุผู้สังเกตการณ์ในทางกลับกัน บทบาทนี้อาจเป็นอินเทอร์เฟซคลาสนามธรรมหรือคลาสคอนกรีตเนื่องจากในหลายกรณีมันจะผสมกับรูปแบบอื่น ๆ ดังนั้นจึงมีกรณีที่ใช้คลาสนามธรรมมากขึ้น
ผู้สังเกตการณ์: บทบาทผู้สังเกตการณ์โดยทั่วไปเป็นอินเทอร์เฟซซึ่งมีวิธีการอัปเดตเพียงวิธีเดียว เมื่อสถานะของผู้สังเกตการณ์เปลี่ยนแปลงวิธีนี้จะถูกเรียก
ผู้สังเกตการณ์เฉพาะ: บทบาทนี้ใช้เพื่อการขยายตัวที่ง่ายและตรรกะทางธุรกิจเฉพาะสามารถกำหนดได้ในบทบาทนี้
ผู้สังเกตการณ์เฉพาะ: การใช้งานเฉพาะของอินเตอร์เฟสผู้สังเกตการณ์ ในบทบาทนี้ตรรกะที่จะประมวลผลเมื่อสถานะของวัตถุที่ถูกสังเกตเห็นการเปลี่ยนแปลง
การใช้รหัสโหมดผู้สังเกตการณ์
วิชาบทคัดย่อระดับสาธารณะ {เวกเตอร์เอกชน <Ebserver> obs = เวกเตอร์ใหม่ <Ebserver> (); โมฆะสาธารณะ addobserver (Observer obs) {this.obs.add (obs); } โมฆะสาธารณะ delobserver (observer obs) {this.obs.remove (obs); } การป้องกันโมฆะ NotifyObServer () {สำหรับ (observer o: obs) {o.update (); }} เป็นโมฆะนามธรรมสาธารณะ dosomething (); - คอนกรีตระดับสาธารณะขยายหัวเรื่อง {โมฆะสาธารณะ dosomething () {system.out.println ("ส่งคืนโดยเหตุการณ์ผู้สังเกตการณ์"); this.notifyobserver (); - ผู้สังเกตการณ์ส่วนต่อประสานสาธารณะ {การอัปเดตโมฆะสาธารณะ (); - คลาสสาธารณะ Concreteobserver1 ใช้ Observer {Public Void Update () {System.out.println ("Observer 1 ได้รับข้อความและกระบวนการ"); }} คลาสสาธารณะ Concreteobserver2 ใช้ Observer {Public Void Update () {System.out.println ("Observer 2 ได้รับข้อความและกระบวนการ"); - ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {หัวเรื่องย่อย = ใหม่คอนกรีตบิวต์ (); Sub.addobserver (คอนกรีตใหม่ใหม่ ()); // เพิ่ม observer1 sub.addobserver (Concreteobserver2 () ใหม่ ()); // เพิ่ม observer2 sub.dosomething (); - การรันผลลัพธ์
เหตุการณ์ผู้สังเกตการณ์กลับด้านและผู้สังเกตการณ์ 1 ได้รับข้อมูลและกระบวนการ
Observer 2 ได้รับข้อมูลและประมวลผล
ผ่านผลการดำเนินการเราจะเห็นว่าเราเรียกเฉพาะวิธีการเรื่อง แต่วิธีการที่เกี่ยวข้องของผู้สังเกตการณ์ทั้งสองถูกเรียกในเวลาเดียวกัน หากคุณดูรหัสอย่างระมัดระวังจริง ๆ แล้วมันง่ายมาก มันไม่มีอะไรมากไปกว่าการที่คุณเชื่อมโยงคลาส Observer ในคลาสหัวเรื่องและสำรวจวิธีการอัปเดตผู้สังเกตการณ์ในวิธี Dosomething
ข้อดีของโหมดผู้สังเกตการณ์
ผู้สังเกตการณ์และผู้สังเกตการณ์มีความสัมพันธ์กันเล็กน้อยและเป็นคู่ที่เป็นนามธรรมเพื่อให้สามารถขยายได้ง่ายขึ้นสำหรับทั้งคู่
โหมดผู้สังเกตการณ์เป็นกลไกทริกเกอร์ที่ใช้กันทั่วไปซึ่งเป็นโซ่ทริกเกอร์และประมวลผลวิธีการของผู้สังเกตการณ์แต่ละคนในทางกลับกัน แต่ในเวลาเดียวกันนี่ก็เป็นข้อเสียของโหมดผู้สังเกตการณ์ เนื่องจากมันถูกกระตุ้นในห่วงโซ่เมื่อมีผู้สังเกตการณ์จำนวนมากปัญหาประสิทธิภาพจึงเป็นกังวลมากขึ้น ยิ่งไปกว่านั้นในโครงสร้างห่วงโซ่ข้อผิดพลาดการอ้างอิงแบบวงกลมมีแนวโน้มที่จะเกิดขึ้นทำให้ระบบแกล้งทำ
สรุป
ในภาษา Java มีผู้สังเกตการณ์อินเทอร์เฟซและคลาสการใช้งานที่สังเกตได้ซึ่งมักจะใช้บทบาทผู้สังเกตการณ์ เราสามารถดูวิธีการใช้งานของสองคลาสนี้ในเอกสาร JDK API
เพื่อนที่ได้ทำ VC ++, JavaScript Dom หรือ Awt Development ล้วนเป็นเรื่องที่น่าอัศจรรย์เกี่ยวกับการประมวลผลกิจกรรมของพวกเขา หลังจากทำความเข้าใจกับรูปแบบผู้สังเกตการณ์พวกเขามีความเข้าใจบางอย่างเกี่ยวกับหลักการของกลไกการประมวลผลเหตุการณ์ หากคุณต้องการออกแบบฟังก์ชั่นของกลไกการประมวลผลเหตุการณ์การใช้โหมดผู้สังเกตการณ์เป็นตัวเลือกที่ดี การประมวลผลเหตุการณ์ DEM (รูปแบบเหตุการณ์การมอบหมาย) ใน AWT ถูกนำมาใช้โดยใช้โหมดผู้สังเกตการณ์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น