โหมดผู้สังเกตการณ์เป็นหนึ่งในโหมดการออกแบบซอฟต์แวร์และใช้กันทั่วไปโดยเฉพาะอย่างยิ่งในการเขียนโปรแกรม GUI มีบทความมากมายเกี่ยวกับรูปแบบการออกแบบที่เขียนบนอินเทอร์เน็ตและบทความจำนวนมากเขียนได้ดี แม้ว่าจะมีความสงสัยในการทำซ้ำล้อต้น แต่ล้อนี้ไม่ใช่ล้ออื่น ๆ โดยมีโฟกัสที่แตกต่างกันความคิดที่แตกต่างกันและวิธีการบอกมันที่แตกต่างกัน
องค์ประกอบสำคัญ
ธีม:
หัวข้อคือวัตถุที่สังเกตได้โดยผู้สังเกตการณ์ หัวข้อจะต้องมีสามลักษณะดังต่อไปนี้
ผู้สังเกตการณ์:
เมื่อเรื่องเปลี่ยนไปการได้รับการแจ้งเตือนสำหรับการประมวลผลเฉพาะเป็นคุณสมบัติที่ผู้สังเกตการณ์ต้องมี
ทำไมต้องใช้โหมดนี้
นี่คือตัวอย่างเพื่อแสดงให้เห็นว่าสถานีส่งนมเป็นธีม ลูกค้าที่สมัครสมาชิกนมคือจอภาพ หลังจากลูกค้าสมัครสมาชิกนมจากสถานีส่งนมเขาจะได้รับนมทุกวัน หากลูกค้าไม่ต้องการสมัครสมาชิกเขาสามารถยกเลิกได้และเขาจะไม่ได้รับนมในอนาคต
การมีเพศสัมพันธ์หลวม
ผู้สังเกตการณ์เพิ่มหรือลบรหัสโดยไม่ต้องแก้ไขหัวข้อเพียงโทรหาวิธีการที่สอดคล้องกันของการเพิ่มหรือลบหัวข้อ
เรื่องนี้มีหน้าที่รับผิดชอบในการแจ้งผู้สังเกตการณ์เท่านั้น แต่ไม่จำเป็นต้องรู้ว่าผู้สังเกตการณ์เกี่ยวข้องกับการแจ้งเตือนอย่างไร ตัวอย่างเช่นสถานีส่งนมมีความรับผิดชอบในการส่งนมเท่านั้นและไม่สนใจว่าลูกค้าจะดื่มหรือล้างหน้า
ผู้สังเกตการณ์เพียงแค่ต้องรอการแจ้งเตือนหัวข้อโดยไม่ต้องสังเกตรายละเอียดที่เกี่ยวข้องกับหัวข้อ สำหรับตัวอย่างเดียวกันลูกค้าจำเป็นต้องใส่ใจเกี่ยวกับสถานีส่งนมเพื่อส่งนมไม่ใช่เกี่ยวกับการจัดส่งที่มาจากหรือประเภทของการขนส่งเพื่อส่งนม
Java ใช้โหมดผู้สังเกตการณ์
1. การใช้งานของ Java เอง
แผนภาพชั้นเรียน
/ ** * เป้าหมายการสังเกตที่สืบทอดมาจาก java.util.observable * @author Stone * */ คลาสสาธารณะ updateObservable ขยายสังเกตได้ {ข้อมูล int ส่วนตัว; Public UpdateObservable (Observer Observer) {Addobserver (Observer); / * * เพิ่มผู้สังเกตการณ์อื่น ๆ */} int สาธารณะ int getData () {ส่งคืนข้อมูล; } โมฆะสาธารณะ setData (ข้อมูล int) {if (data! = this.data) {this.data = data; setchanged (); // การเปลี่ยนแปลงแท็ก, NotifyobServers (); // การแจ้งเตือน}} @Override เป็นโมฆะที่ซิงโครไนซ์สาธารณะ addobserver (Observer o) {super.addoBserver (O); } @Override สาธารณะที่ซิงโครไนซ์เป็นโมฆะ deleteobserver (ผู้สังเกตการณ์ o) {super.deleteobserver (O); } @Override โมฆะสาธารณะ NotifyobServers () {super.notifyobservers (); } @Override โมฆะสาธารณะ NotifyobServers (Object Arg) {super.notifyobservers (ARG); } @Override สาธารณะที่ซิงโครไนซ์เป็นโมฆะ deleteobservers () {super.deleteobservers (); } @Override void void setChanged () {super.setchanged (); } @Override Void Clearchanged () {super.clearchanged (); } @Override Public Synchronized Boolean Haschanging () {return super.haschanged (); } @Override สาธารณะที่ซิงโครไนซ์ int countobservers () {return super.countobservers (); - / ** * ผู้สังเกตการณ์ใช้ Java.util.observer Interface * @author Stone * */ คลาสสาธารณะ UpdateObserver ใช้ Observer {@Override การอัปเดตโมฆะสาธารณะ ถ้า (o อินสแตนซ์ของ updateObservable) {updateObservable uo = (updateObservable) o; System.out.print ("ข้อมูลเปลี่ยนเป็น:" + uo.getData ()); - 2. แบบจำลองการสังเกตที่กำหนดเอง
แผนภาพชั้นเรียน
/ ** * Abstract Observer * การอัพเดทการสังเกต * @author Stone * */ อินเตอร์เฟสสาธารณะ Iwatcher {/ * * อินเทอร์เฟซการแจ้งเตือน: * 1. การแจ้งเตือนง่าย ๆ * 2. ผู้สังเกตการณ์ต้องการข้อมูลการเปลี่ยนแปลงของเป้าหมายดังนั้นเป้าหมายสามารถใช้เป็นพารามิเตอร์ดูผู้สังเกตการณ์ของ Java เป็นโมฆะอัพเดท (); - / ** * หัวเรื่องเป้าหมายนามธรรม * จัดเตรียมอินเทอร์เฟซเพื่อลงทะเบียนและลบวัตถุ Observer และอินเทอร์เฟซเพื่อแจ้งให้ผู้สังเกตเห็นสังเกต * และอินเทอร์เฟซที่สังเกตเห็นเป้าหมาย * @author Stone * */ ส่วนต่อประสานสาธารณะ iwatchedSubject {Public Void เพิ่ม โมฆะสาธารณะลบ (นาฬิกา iwatcher); โมฆะสาธารณะ NotifyWhatchers (); การอัปเดตโมฆะสาธารณะ (); // อินเทอร์เฟซกับการเปลี่ยนแปลงทางธุรกิจที่สังเกตได้} / ** * ผู้สังเกตการณ์เฉพาะผู้สังเกตการณ์คอนกรีต * * @author Stone * */ คลาสสาธารณะ UpdateWatcher ใช้ iWatcher {@Override โมฆะสาธารณะอัปเดต () {System.out.println (สิ่งนี้ + "สังเกต: เป้าหมายได้รับการอัปเดต"); - / ** * หัวเรื่องเป้าหมายเป้าหมายเฉพาะ * @author stone * */ คลาสสาธารณะ UpdateWatchedSubject ใช้ iWatchedSubject {รายการส่วนตัว <Iwatcher> รายการ; Public UpdateWatchedSubject () {this.list = new ArrayList <Iwatcher> (); } @Override โมฆะสาธารณะเพิ่ม (Iwatcher Watch) {this.list.add (ดู); } @Override โมฆะสาธารณะลบ (นาฬิกา iWatcher) {this.list.remove (ดู); } @Override โมฆะสาธารณะ NotifyWhatchers () {สำหรับ (iWatcher Watcher: list) {watcher.update (); }} @Override โมฆะสาธารณะอัปเดต () {system.out.println ("การอัปเดตเป้าหมาย ...... "); NotifyWhatchers (); - ผู้ฟังคือการใช้งานของผู้สังเกตการณ์:
แผนภาพชั้นเรียน
/ ** * ผู้ฟังหลังจากลงทะเบียน * @author Stone * */ ส่วนต่อประสานสาธารณะ iRegisterListener {void onregistered (); - / ** * ฟังเมื่อผู้ใช้เข้าสู่ระบบใน * @author Stone * */ ส่วนต่อประสานสาธารณะ iloginListener {โมฆะ onlogined (); - /** Listener เป็นการใช้งานโหมด Observer* เพิ่มผู้ฟังไปยังอินเทอร์เฟซธุรกิจบางอย่างที่ต้องฟังโทรหาวิธีการที่สอดคล้องกันของผู้ฟังเพื่อใช้การฟัง*/ ผู้ใช้ระดับสาธารณะ {การลงทะเบียนโมฆะสาธารณะ // หลังจากลงทะเบียนลงทะเบียน onregerted (); } การเข้าสู่ระบบโมฆะสาธารณะ (ล็อกอิน iloginListener) { / * * ทำ ... เข้าสู่ระบบ * / System.out.println ("การลงทะเบียน ... "); // หลังจากเข้าสู่ระบบ onlogined (); - /*** รูปแบบพฤติกรรมโหมดผู้สังเกตการณ์* โหมดผู้สังเกตการณ์กำหนดการพึ่งพาแบบหนึ่งต่อหลายคนทำให้วัตถุผู้สังเกตการณ์หลายรายสามารถสังเกตวัตถุเป้าหมายได้ในเวลาเดียวกัน * เมื่อวัตถุเป้าหมายนี้เปลี่ยนไปในสถานะมันจะแจ้งวัตถุผู้สังเกตการณ์ทั้งหมดเพื่อให้สามารถอัปเดตตนเองได้โดยอัตโนมัติ วัตถุเป้าหมายต้องการอินเทอร์เฟซเพื่อเพิ่มลบและแจ้งผู้สังเกตการณ์ * * @author stone */ การทดสอบระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {/ * * ใช้อินเทอร์เฟซ Observer ของ Java และคลาสที่สังเกตได้ สังเกตได้ SetData (99); System.out.println (""); System.out.println (""); /** โมเดลผู้สังเกตการณ์ที่กำหนดเอง*/ iwatchedSubject ดู = ใหม่ updateWatchEdSubject (); watched.add (ใหม่ UpdateWatcher ()); watched.add (ใหม่ UpdateWatcher ()); ดู. update (); System.out.println (""); /** โหมดย่อย -Listener*/ ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.register (ใหม่ iregisterListener () {@Override โมฆะสาธารณะ onregistered () {system.out.println ("หลังจากฟังการลงทะเบียน ... ");}}); user.login (ใหม่ iloginListener () {@Override โมฆะสาธารณะ onlogined () {system.out.println ("หลังจากฟังการเข้าสู่ระบบ ... ");}}); -พิมพ์
ได้รับการแจ้งเตือนการเปลี่ยนแปลงข้อมูล: ข้อมูลเปลี่ยนเป็น: 99 เป้าหมายกำลังได้รับการอัปเดต ... Observer.updateWatcher@457471E0 สังเกต: เป้าหมายได้รับการอัปเดต Observer.updateWatcher@5FE04CBF สังเกต: เป้าหมายได้รับการอัพเดทและลงทะเบียน ... หลังจากฟังการลงทะเบียน - - เข้าสู่ระบบ ... หลังจากฟังการเข้าสู่ระบบ - -