هناك دائما هذه الواجهات معينة بين الوحدات. من منظور أساليب الاتصال ، يمكن تقسيمها إلى ثلاث فئات: المكالمات المتزامنة وعمليات الاسترجاعات والمكالمات غير المتزامنة. يركز التالية على شرح آلية رد الاتصال بالتفصيل.
1. نظرة عامة
آلية رد الاتصال في Java هي آلية شائعة نسبيًا ، ولكن يمكن استخدامها أقل في البرنامج ، ويمكن رؤية آليات رد الاتصال في كل مكان في بعض الأطر الكبيرة. تستخدم هذه المقالة بعض الأمثلة المحددة للاقتراب ببطء من آلية رد الاتصال في Java.
2. رد الاتصال
ما يسمى رد الاتصال: يعني استدعاء الطريقة C في الفئة A في الفئة B ، ثم استدعاء طريقة D في الفئة A في الفئة B في الفئة B. تسمى هذه الطريقة D طريقة رد الاتصال. عند استخدامه فعليًا ، سيكون هناك نماذج رد اتصال مختلفة ، مثل النماذج التالية.
2.1 عمليات الاسترداد المتزامنة
هنا أفترض مثل هذا الموقف.
أخبر مدير الشركة A B مرؤوسه (مدير المشروع C) أنه يريد إجراء مسح ، لكن C لم يكن بحاجة إلى القيام بذلك بنفسه. يمكن أن يُطلب من المدير C ترتيب المبرمج D لإكماله. وجد المدير C المبرمج D وأخبره أنه سيتم الانتهاء من مهمة بحثية الآن. وأخبر المدير ج عن نتائج المسح. إذا كانت هناك أي مشكلة ، فلا يزال يتعين عليك المتابعة. لأن هنا C يطلب من D القيام بشيء ما ، لا يزال يتعين على D أن ينقل النتيجة بـ C بعد ذلك. هذا هو نموذج رد الاتصال. فيما يلي مخطط فئة رد الاتصال العام:
أولاً ، نحتاج إلى الحصول على واجهة رد الاتصال على واجهة رد الاتصال
CallbackInterface.java
الواجهة العامة callbackInterface {public boolean check (int result) ؛} في الخلفية ، يريد المبرمج D توصيل النتائج مع Project Manager C ، وبالتالي يحتاج مدير المشروع إلى تنفيذ واجهة رد الاتصال أعلاه:
مدير
مدير الفئة العامة ينفذ CallbackInterface {Private Programmer Programmer = NULL ؛ المدير العام (المبرمج _programmer) {this.programmer = _programmer ؛ } / *** المستخدمة للوفد الصادر عن Boss* / public void equerrust () {ترتيب () ؛ }. البرمجي. Study (Manager.This) ؛ System.out.println ("تم الانتهاء من جدول العمل للمبرمج ، وذهب المدير للقيام بأشياء أخرى.") ؛ } Override Public Boolean Check (int result) {if (result == 5) {return true ؛ } إرجاع خطأ ؛ }} بالنسبة للمبرمج D ، يحتاج إلى عقد عرض أسعار من Manager C من أجل التواصل معه. ومع ذلك ، إليكم المهمة التي طلب المخرج ب من المدير C ترتيبها. بمعنى آخر ، يمكن أيضًا طلب المديرين الآخرين هنا ، مثل المديرين B1 و B2 ، وما إلى ذلك لأن المديرين قاموا بتنفيذ واجهة رد الاتصال ، يمكنك السماح للمبرمج مباشرة باحتفاظ بهذه الواجهة هنا. على النحو التالي:
البرمجي
Public Class Programmer {public void study (CallbackInterface Callback) {int result = 0 ؛ do {result ++ ؛ System.out.println ("th" + result + "نتيجة الدراسة") ؛ } بينما (! callback.check (نتيجة)) ؛ System.out.println ("تنتهي مهمة المسح") ؛ }} إنه أبسط وأكثر وضوحًا بالنسبة للمخرج ، لأن هذا يعادل اختبار العميل:
Boss.java
Public Class Boss {public static void main (string [] args) {Manager Manager = New Manager (New Programmer ()) ؛ manager.entrust () ؛ }} نتائج التشغيل:
المدير يرتب العمل لمبرمج. نتائج الدراسة الأولى. نتائج الدراسة الثانية. نتائج الدراسة الثالثة. نتائج الدراسة الرابعة. نتائج الدراسة الخامسة. الدراسة الخامسة. تم الانتهاء من عمل الجدولة للمبرمج. لقد فعل المدير أشياء أخرى.
2.2 عمليات الاسترداد غير المتزامنة
بالنسبة للمثال أعلاه ، لا يمكن لـ Project Manager دائمًا انتظار نتائج بحثك. ولكن بعد تسليم هذه المهمة لك ، سوف يتجاهلها. سيفعل شيئًا خاصًا به ، وسوف تفعل شيئًا خاصًا بك. لذلك ، يجب معالجة وظيفة رد الاتصال بشكل غير متزامن هنا.
لذلك ، هنا نحتاج إلى تعديل رمز فئة المبرمج ، وتعديله على النحو التالي:
البرمجي
Public Class Programmer {Public Programmer () {} public void study (CallbackInterface Callback) {New StudyThread (Callback) .start () ؛ } // ----------------------------- البرمجي 正在做的工作 --------------------------- studyTresThread يمتد Thread {callbackinterface callback = null ؛ Public StudyTherD (CallbackInterface _callback) {callback = _callback ؛ } Override public void run () {int result = 0 ؛ do {result ++ ؛ System.out.println ("th" + result + "نتيجة الدراسة") ؛ } بينما (! callback.check (نتيجة)) ؛ System.out.println ("تنتهي مهمة المسح") ؛ }}}نتائج التشغيل:
يقوم المدير بجدولة العمل لمبرمج تم الانتهاء من أعمال الجدولة للمبرمج ، ويقوم المدير بأشياء أخرى.
نتائج نتائج الدراسة الأولى لنتائج الدراسة الثانية لنتائج الدراسة الثالثة لنتائج الدراسة الرابعة للدراسة الخامسة انتهت مهمة البحث
2.3 عمليات الإغلاق والاسترداد
الإغلاق هو كائن قابل للاستدعاء يسجل بعض المعلومات من النطاق الذي تم إنشاؤه به.
2.3.1 مكالمة طبيعية
أولاً ، يمكننا أن نرى كيف يتم إجراء المكالمة في ظل الظروف العادية.
زيادة. جافا
واجهة متزايدة {void styrement () ؛}هذه واجهة عادية (إنها مجرد واجهة عادية في المكالمات العادية ، وهي واجهة رد اتصال في رد الاتصال ، والتي يجب أن يكون من السهل فهمها).
Callee1.Java
الفئة Callee1 تنفذ زيادة {private int i = 0 ؛ Override public void styrement () {i ++ ؛ system.out.println (i) ؛ }}رد الاتصال
عدادات الفئة العامة {public static void main (string [] args) {callee1 callee1 = new callee1 () ؛ callee1.increment () ؛ }}عوامل الاسترجاعات هي فئة عميل اختبار ، لا يوجد شيء يمكن قوله ، فقط انظر إلى الكود أعلاه.
2.3.2 رد الاتصال التجربة الأولية
لا يوجد ما يقوله عن المكالمات العادية أعلاه ، لأنه بالنسبة لمبرمج Java العادي ، يجب أن يكون هذا شيئًا يمكن القيام به دون التفكير.
الآن إذا كنت ترغب في تكوين رد اتصال ، فمن المستحيل أن يكون لديك عالي واحد فقط (كائن رد الاتصال Callee1) من حيث بنية أو منطق البرنامج ، وتحتاج أيضًا إلى كائن متصل. يمكن للمتصل كتابته مثل هذا:
Caller.Java
Class Caller {Private Guyrementable Conflerference ؛ المتصل العام (قابلة لزيادة _callbackReference) {callbackReference = _callbackReference ؛ } void go () {callbackReference.increment () ؛ }} يحتفظ المتصل هنا باحتفال رد اتصال لواجهة رد الاتصال ، تمامًا مثل المبرمج المذكور أعلاه ، يحتاج إلى مرجع مدير المشروع ، بحيث يمكنك التواصل مع مدير المشروع من خلال هذا المرجع. يلعب رد الفعل هنا أيضًا هذا الدور.
الآن دعونا نلقي نظرة على كتابة فئة الاختبار:
رد الاتصال
عدادات الفئة العامة {public static void main (string [] args) {callee1 callee1 = new callee1 () ؛ Caller Caller1 = Caller جديد (Callee1) ؛ caller1.go () ؛ }}بالنسبة لرمز البرنامج حتى الآن ، يمكننا مقارنة الكود الذي يربحه مدير المشروع بالكامل بالكامل للتحقيق في المشكلات التقنية. لها نفس التأثير.
2.3.3 الإغلاق رد الاتصال
بالمقارنة مع عمليات الاسترجاعات العادية ، فإن جوهر عمليات عروض الإغلاق يكمن بشكل طبيعي في عمليات الإغلاق ، أي السيطرة على النطاق.
لنفترض الآن أن المستخدم (مبرمج آخر) يقوم بتخصيص فئة myincrement ويتضمن طريقة زيادة. على النحو التالي:
class myincrement {public void studrement () {system.out.println ("mycrement.increment") ؛ } static void f (myincrement cheld) {studrement.increment () ؛ }}هناك فئة أخرى callee2 موروثة من الفئة أعلاه:
Class Callee2 يمتد myincrement {private int i = 0 ؛ زيادة الفراغ العام () {super.increment () ؛ i ++ ؛ system.out.println (i) ؛ }}من الواضح أنه إذا كنت ترغب في استدعاء طريقة الزيادة () هنا ، فإنها تصبح استدعاء وظيفة عامة. لذلك نحن هنا نحتاج إلى تعديل فئة Callee2 أعلاه. الهدف من التعديل هو جعل فئة Callee2 متوافقة مع طريقة الزيادة () لفئة myincrement وطريقة زيادة () للزيادة. بعد التعديل:
Class Callee2 يمتد myincrement {private int i = 0 ؛ زيادة الفراغ العام () {super.increment () ؛ i ++ ؛ system.out.println (i) ؛ } تنفذ إغلاق الفئة الخاصة {Override public void styrement () {callee2.This.increment () ؛ }} getCallBackReference () {return new closure () ؛ }} لاحظ أن فئة الإغلاق هنا هي فئة خاصة ، وهي عنصر إغلاق. نظرًا لأن فئة الإغلاق خاصة ، يجب أن تكون هناك واجهة مفتوحة للعمليات على كائنات الإغلاق. هذه هي طريقة getCallbackReference () أعلاه. لم يتغير فئة المتصل.
لاختبار العملاء ، فقط انظر إلى الرمز:
عدادات الفئة العامة {public static void main (string [] args) {callee2 callee2 = new callee2 () ؛ Caller Caller2 = New Caller (Callee2.GetCallbackReference ()) ؛ caller2.go () ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.