สวัสดี วันนี้ฉันอยากจะแบ่งปันบางอย่างกับคุณ ตัวอย่างเช่น สิ่งนี้ถูกใช้บ่อยใน JavaScript ฉันจะพูดเกี่ยวกับการโทรกลับ คุณรู้หรือไม่ว่าจะใช้สิ่งนี้เมื่อใดและอย่างไร? คุณเข้าใจการใช้งานในสภาพแวดล้อม Java หรือไม่? เมื่อฉันถามตัวเองด้วยคำถามเหล่านี้ ฉันจึงเริ่มค้นคว้าเรื่องนี้ แนวคิดเบื้องหลังสิ่งนี้คือการผกผันของการควบคุม (PS: คำอธิบายของวิกิพีเดียคือการผกผันของการควบคุมซึ่งย่อว่า IoC) ซึ่งเป็นหลักการออกแบบในการเขียนโปรแกรมเชิงวัตถุที่สามารถใช้เพื่อลดการมีเพศสัมพันธ์ระหว่างรหัสคอมพิวเตอร์ระดับ) ตัวอย่างนี้ อธิบายวิธีการทำงานของกรอบงานตามหลักการ "ฮอลลีวูด - อย่าโทรหาฉันเราจะโทรหาคุณ" ที่รู้จักกันดี
ใช้รูปแบบการโทรกลับอย่างง่ายใน Java เพื่อทำความเข้าใจตัวอย่างเฉพาะดังต่อไปนี้:
อินเทอร์เฟซ CallBack { void methodToCallBack();} class CallBackImpl ใช้ CallBack { public void methodToCallBack() { System.out.println("ฉันถูกเรียกกลับ"); }} class Caller { public void register (CallBack callback) { callback .methodToCallBack(); } สาธารณะคงเป็นโมฆะ main(String[] args) { ผู้โทรเข้า = ผู้โทรใหม่ (); CallBack callBack = ใหม่ CallBackImpl(); caller.register(โทรกลับ); }}
คุณอาจต้องการถามฉันว่าเมื่อใดควรใช้สิ่งนี้หรืออะไรคือความแตกต่างระหว่างการโทรโดยตรงและกลไกการโทรกลับ?
คำตอบคือ: ตัวอย่างนี้แสดงให้คุณเห็นถึงวิธีการสร้างฟังก์ชันการโทรกลับในสภาพแวดล้อม Java แน่นอนว่ามันไม่มีประโยชน์อะไรที่จะใช้มันแบบนั้น ให้เราตรวจสอบรายละเอียดเพิ่มเติมตอนนี้
แนวคิดภายในคือการผกผันของการควบคุม ลองใช้ตัวจับเวลาเป็นตัวอย่างในชีวิตจริง สมมติว่าคุณรู้ว่ามีตัวจับเวลาพิเศษที่รองรับการโทรกลับรายชั่วโมง พูดให้ถูกคือ หมายความว่าทุก ๆ ชั่วโมง ตัวจับเวลาจะโทรหาวิธีการโทรที่คุณลงทะเบียนไว้
ตัวอย่างเฉพาะ:
เราต้องการอัปเดตเว็บไซต์ทุกชั่วโมง นี่คือตัวอย่างโมเดล UML:
อินเทอร์เฟซการโทรกลับ:
ก่อนอื่นมากำหนดอินเทอร์เฟซการโทรกลับ:
import java.util.ArrayList;import java.util.List;// ตัวอย่าง: สมมติว่าอินเทอร์เฟซนี้ถูกเสนอจากระบบปฏิบัติการของคุณเพื่อนำไปใช้อินเทอร์เฟซ TimeUpdaterCallBack { void updateTime(long time);}// นี่คือการใช้งานของคุณ/ / ตัวอย่าง: คุณต้องการอัปเดตเวลาเว็บไซต์ของคุณทุก ๆ ชั่วโมง WebSiteTimeUpdaterCallBack จะใช้ TimeUpdaterCallBack { @Override public void updateTime(long time) { // พิมพ์เวลาที่อัปเดต ที่ใดก็ได้ในตัวอย่างเว็บไซต์ของคุณ System.out.println(time); }}
ในตัวอย่างของเรา ตัวจับเวลาของระบบรองรับวิธีการโทรกลับ:
// นี่คือ SystemTimer ที่ระบบปฏิบัติการ (OS) ของคุณใช้งาน // คุณไม่รู้ว่าตัวจับเวลานี้ถูกใช้งานอย่างไร ตัวอย่างนี้ // แสดงให้คุณเห็นว่ามันจะมีลักษณะอย่างไร ตัวคุณเองถ้าคุณต้องการ.class SystemTimer { List<TimeUpdaterCallBack> callbacks = new ArrayList<TimeUpdaterCallBack>(); public void registerCallBackForUpdatesEveryHour(TimeUpdaterCallBack timerCallBack) { callbacks.add(timerCallBack); } // ... SystemTimer นี้อาจมีตรรกะมากกว่านี้เราไม่รู้ ... // ณ จุดหนึ่งของการนำ SystemTimer นี้ไปใช้ (คุณไม่รู้) / / เมธอดนี้จะถูกเรียกใช้และทุก timerCallBack ที่ลงทะเบียนไว้ // จะถูกเรียก ทุก ๆ ตัวจับเวลาที่ลงทะเบียนไว้อาจมีการใช้งานที่แตกต่างกันโดยสิ้นเชิง // ของเมธอด updateTime() และ my be // ถูกใช้ในรูปแบบที่แตกต่างกันโดยไคลเอนต์ที่แตกต่างกัน oneHourHasBeenExprired() { สำหรับ (TimeUpdaterCallBack timerCallBack : โทรกลับ) { timerCallBack.updateTime (System.currentTimeMillis()));
สุดท้ายนี้ นี่คือตัวอัปเดตเวลาของเว็บไซต์ในตัวอย่างง่ายๆ จำลองของเรา:
// นี่คือลูกค้าของเรา มันจะถูกใช้ในตัวอย่างเว็บไซต์ของเรา มันจะอัพเดต// เวลาของเว็บไซต์ทุกๆ ชั่วโมง webSiteCallBackUpdater = WebSiteTimeUpdaterCallBack ใหม่ (); SystemTimer.registerCallBackForUpdatesEveryHour (เว็บไซต์CallBackUpdater); }}
ข้อความต้นฉบับ: http://cleancodedevelopment-qualityseal.blogspot.com/2012/10/understand-callbacks-with-java.html