ภาษา Java มีการสนับสนุนโดยตรงสำหรับรูปแบบการออกแบบเช่นโหมดคำสั่งโหมดตัวแทนสังเกตโหมดการสังเกต ฯลฯ แม้ว่า Java จะให้การสนับสนุนรูปแบบเหล่านี้ง่ายมากและไม่สามารถตอบสนองแอพพลิเคชั่นที่ซับซ้อนได้มากขึ้น แต่ในสถานการณ์ง่ายๆการใช้คลาสเหล่านี้มักจะได้ผลของการมองเห็นเงา ดังนั้นหากคุณไม่มีความต้องการพิเศษใด ๆ ก็จะเป็นการดีกว่าที่จะใช้คลาสเหล่านี้ใน Java
โหมดผู้สังเกตการณ์หรือที่เรียกว่าโหมดการตรวจสอบและโหมดผู้สังเกตการณ์เป็นหนึ่งในโหมดการออกแบบคลาสสิก (หนึ่งใน GOF) ในภาษา Java ส่วนใหญ่มีคลาสและอินเทอร์เฟซต่อไปนี้ที่รองรับสำหรับรูปแบบนี้ทั้งหมดจากแพ็คเกจ Java.beans:
java.beans.propertychangelistener (อินเทอร์เฟซ) java.beans.propertychangesupport (ชั้นเรียน) java.beans.propertychangeEvent (คลาส) java.beans.propertychangelistener
นี่คืออินเทอร์เฟซ เห็นได้ชัดว่าคลาสทั้งหมดที่ใช้อินเทอร์เฟซนี้คือผู้ฟัง (หรือผู้สังเกตการณ์) ซึ่งจะสนใจในการเปลี่ยนแปลงบางอย่างในวัตถุที่ฟัง อินเทอร์เฟซนี้มีวิธีเดียว:
โมฆะสาธารณะ PropertyChange (PropertyChangeEvent EVT) {// todo วิธีการสร้างอัตโนมัติ stub} คำจำกัดความของอินเตอร์เฟสนั้นง่ายและฟังก์ชั่นชัดเจน ยอมรับเหตุการณ์ (PropertyChangeEvent ที่สร้างโดยผู้ฟัง) จากนั้นตอบสนองตามเหตุการณ์นี้
java.beans.propertychangesupport
คลาสนี้ใช้ในชั้นเรียนของผู้สังเกตการณ์เพื่อบันทึกผู้สังเกตการณ์ที่ลงทะเบียนและเพื่อให้พวกเขามีการเปลี่ยนแปลงของผู้สังเกตการณ์ มีวิธีไม่มากนักสำหรับประเภทนี้ แต่ก็ยังแนะนำเพียง 100% ของพวกเขามิฉะนั้นคุณจะไม่สามารถใช้สมองของคุณได้ฮ่าฮ่า
Public Property Changesupport (Object SourceBean)
นี่คือตัวสร้างและพารามิเตอร์คือผู้ฟัง โดยทั่วไปแล้ว PropertyChangelistener ใช้เป็นทรัพย์สินของผู้ฟัง โดยทั่วไปใช้ดังนี้:
ผู้ฟังส่วนตัว
โปรดทราบว่าผู้ฟังนี้ไม่ได้เป็นตัวแทนของผู้ฟังเพียงคนเดียวเขาอาจเป็นกลุ่มผู้ฟัง แล้วใครคือผู้ฟังเหล่านี้? ครั้งนี้ฉันใช้วิธีการต่อไปนี้
โมฆะสาธารณะ AddPropertyChangelistener (ผู้ฟัง PropertyChangelistener)
คลาสนี้ง่ายเกินไปเพิ่มผู้ฟัง เช่นเดียวกับสภาคองเกรสแห่งชาติที่ 17 ของพรรคคอมมิวนิสต์จีนหากนักข่าวต้องการสัมภาษณ์เขาต้องลงทะเบียนก่อน เห็นได้ชัดว่าวิธีนี้สามารถเรียกได้หลายครั้ง (เพิ่ม) นอกจากนี้และการลบ:
โมฆะสาธารณะ RemovePropertyChangelistener (ผู้ฟัง PropertyChangelistener)
หากจอภาพไม่สนใจการเปลี่ยนแปลงใด ๆ ในบุคคลที่ถูกตรวจสอบเขาจะถูกขับออกจากจอภาพ
โอเคนักข่าวทุกคนอยู่ที่นี่และหากมีการเปลี่ยนแปลงใด ๆ ในจอภาพก็ถึงเวลาที่ต้องแจ้งบุคคลนั้น ใช้วิธีหนึ่งต่อไปนี้:
โมฆะสาธารณะ FirepropertyChange (PropertyChangeEvent EVT) โมฆะสาธารณะ FirepropertyChange (สตริง PropertyName, Boolean OldValue, Boolean newValue) โมฆะสาธารณะ FirepropertyChange (สตริงคุณสมบัติ
ในความเป็นจริงพารามิเตอร์ของสามวิธีสุดท้ายจะถูกห่อหุ้มลงใน PropertyChangeEvent จากนั้นวิธีแรกจะถูกเรียก อย่างไรก็ตามในความเป็นจริงเรายังคงต้องการเรียกหนึ่งในสามสุดท้ายและเราไม่สนใจเกี่ยวกับการห่อหุ้ม สามวิธีสุดท้ายมีพารามิเตอร์สามตัวซึ่ง OldValue และ NewValue เป็นค่าก่อนและหลัง คนแรกคือการเปลี่ยนชื่อเพื่อให้ผู้ฟังสามารถตอบกลับได้ตามชื่อนี้ เช่นเดียวกับในการประชุมข้อมูลทั้งหมดของรัฐบาลจะถูกได้ยินโดยนักข่าว แต่นักข่าวบางคนสนใจเพียงแค่ปัญหาไต้หวันในขณะที่คนอื่น ๆ สนใจในปัญหาจีน-ญี่ปุ่น
นั่นคือทั้งหมดที่แนะนำวิธีการจัดหาอสังหาริมทรัพย์ โปรดทราบว่าเนื่องจาก PropertyChangesupport ถูกใช้ในชั้นเรียน (โดยปกติจะเป็นแบบจำลอง) ของผู้สังเกตการณ์วิธีการของมันจะถูกเรียกที่นี่เฉพาะเมื่อสังเกตเห็น
java.beans.propertychangeEvent
ฉันขี้เกียจเกินไปที่จะแนะนำชั้นเรียนนี้เพียงแค่ดูวิธีการหลักของเขาและเข้าใจว่าเกิดอะไรขึ้น
สตริงสาธารณะ getPropertyName () วัตถุสาธารณะ getNewValue () วัตถุสาธารณะ getOldValue ()
มีสามหมวดหมู่และอื่น ๆ คือการวิเคราะห์ปัญหาเฉพาะ มาเป็นตัวอย่างก่อนอื่นผู้สังเกตการณ์:
โดเมนคลาสสาธารณะ {รหัสสตริงที่ป้องกัน; ชื่อสตริงที่ได้รับการป้องกัน มีการป้องกันสตริง desname; PropertyChangesupport Listeners = ใหม่ PropertyChangesupport (นี่); สตริงสาธารณะ getId () {return id; } โมฆะสาธารณะ setId (รหัสสตริง) {this.id = id; Firepropertychange ("domain.id", null, id); } สตริงสาธารณะ getDesName () {return desname; } โมฆะสาธารณะ setDesName (สตริง desname) {this.desName = desname; Firepropertychange ("domain.desname", null, desname); } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; Firepropertychange ("domain.name", null, ชื่อ); } โมฆะสาธารณะ addPropertyChangelistener (ผู้ฟัง PropertyChangelistener) {Listeners.addPropertyChangelistener (ผู้ฟัง); } โมฆะสาธารณะ FirePropertyChange (ชื่อสายพยากรณ์, Object OldValue, Object NewValue) {Listeners.FirePropertyChange (ชื่อ propname, oldValue, newValue); } โมฆะสาธารณะ removePropertyChangelistener (ผู้ฟัง PropertyChangelistener) {Listeners.removePropertyChangeListener (ผู้ฟัง); - บางคนมีความสนใจในสามคุณสมบัติของโดเมน นี่คือหนึ่งในคนเหล่านี้:
Public Class SimpleObserver ใช้ PropertyChangelistener {.... @Override โมฆะสาธารณะ PropertyChange (PropertyChangeEvent eVt) {ถ้า (evt.getPropertyName (). เท่ากับ ("domain.name")) {// ทำงานบางอย่าง}}}}}}} นี่คือคลาสทดสอบที่เรียบง่าย:
คลาสสาธารณะที่ง่ายที่สุด {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {simpleobserver observer = new SimpleObserver (); โดเมนโดเมน = โดเมนใหม่ (); domain.addpropertychangelistener (ผู้สังเกตการณ์); domain.setName ("Yangsq"); -เห็นได้ชัดว่าสามารถสังเกตการดำเนินการของวิธีการจัดหาอสังหาริมทรัพย์ใน SimpleObserver ได้