إرسال مزدوج
ما هو التوزيع المزدوج؟
عند الحديث عن البرمجة الموجهة للكائنات ، نتحدث غالبًا عن "تعدد الأشكال" الموجهة نحو الكائن. من بينها ، غالبًا ما يكون هناك قول حول تعدد الأشكال "يشير مرجع الطبقة الوالدية إلى كائن فئة الطفل".
تتم كتابة هذا المرجع الفئة الأصل إلى كائنات الفئة الفرعية مثل ما يلي:
حيوان حيوان = كلب جديد () ؛ Animal.bark () ؛
شكل آخر شائع الاستخدام هو
حارس الفئة العامة {public void يقول (Animal a) {system.out.println ("Animal says") ؛ } public void يقول (كلب الكلب) {system.out.println ("Dog says") ؛ }} Animal Animal = new Animal () ؛ كلب حيوان = كلب جديد () ؛ Keeper Keeper = New Keeper () ؛ Keeper.Say (حيوان) ؛ Keep.say (كلب) ؛ ما هو المحتوى الذي سيتم إخراجه عندما يقول الحارس أعلاه المكالمات مرتين؟ هل سيتم استدعاء طريقتين مختلفتين؟
في الواقع ، خلال هاتين المكالمتين ، تقول الطريقة (الحيوان أ) سيتم استدعاؤها. نظرًا لأنه يمكن العثور على هذه المحتويات في فترة التجميع ، فهذا هو التوزيع الثابت لـ Java.
من الشكل أعلاه ، يمكننا أن نرى أن رمز Bytecode الذي تم إنشاؤه بواسطة المكالمتين يشير إلى طريقة (Animal A). يتم تنفيذ الطريقة مباشرة في وقت التشغيل والمحتوى المقابل هو الإخراج.
لماذا ينتهي الأمر بالحيوان المقابل. هذا هو تحديد نوع مستلم الطريقة المحددة في وقت التشغيل وتنفيذه. وهذا ما يسمى التوزيع الديناميكي ، والذي يحدد طرقًا محددة في وقت التشغيل وينفذ تعدد الأشكال الموجهة للكائنات.
إرسال
يشير التوزيع إلى عملية اللمسات الأخيرة على طريقة يتم تنفيذها.
بالنسبة للغات الثابتة مثل Java ، يتم تنفيذها جميعًا من خلال توزيع واحد (إرسال واحد).
على سبيل المثال ، سطر الكود
dog.eat(new Bone())
سيقوم التنفيذ النهائي لطريقة EAT التي يتم تحديده فقط بتحديد الطريقة المقابلة وفقًا للنوع المحدد من الكلب ، ولا يمكن أن تؤثر المعلمات التي تم تمريرها على اختيار الطريقة المقابلة. هذا هو إرسال واحد
من أجل جعل المعلمات الحقيقية تنتقل ، العظام هنا لتلعب دورًا حقًا ، فأنت بحاجة إلى استخدام إرسال مزدوج أو إرسال متعدد
وهذا يعني أن القرار النهائي ليس فقط مستقبل الطريقة ، ولكن أيضًا نوع المعلمة.
وضع الزائر
في وضع تصميم GOF ، يستخدم وضع الزوار إرسال مزدوج لتحقيق الغرض من استدعاء الكائنات الحقيقية.
بالنسبة لوضع الزوار ، فإن المثال الأكثر شيوعًا هو اجتياز الأشجار. على سبيل المثال ، هناك اختلافات في طريقة معالجة العقد والأوراق. يتم ذلك من خلال التوزيع المزدوج للزائر لتنفيذ عناصر مختلفة وتنفيذ محتويات مختلفة.
الرمز يشبه هذا:
node.accept (concreatevisitor () جديد) ؛ Leaf.Accept (concreatevisitor () جديد) ؛
سوف تمر طريقة القبول في العقدة نوعها الحقيقي مرة أخرى إلى الزائر مرة أخرى
Public Void قبول (زائر V) {v.visit (this) ؛ }في هذا الوقت ، في الزائر ، يمكنك استدعاء طرق محددة وفقًا للنوع الحقيقي ، وهناك طرق مماثلة لتلك المقابلة للعقدة والأوراق:
زيارة الفراغ العامة (العقدة N) ؛ زيارة باطلة عامة (ورقة L) ؛
زائر لتلخيص ، ويشمل عمومًا واجهة الزوار. في واجهة الزائر ، يحتوي على منطق المعالجة لكل كائن عنصر ليتم الوصول إليه. في التنفيذ المحدد لكل عنصر ، تقوم بتمرير النوع الخاص بك مرة أخرى إلى الزائر للتوزيع الثانوي لتنفيذ المكالمة المنطقية الدقيقة.
التطبيقات في Tomcat
يستخدم الزائر أيضًا في Tomcat ، وعادة ما يكون تحليل تعبيرات EL.
على سبيل المثال org.apache.el.parser.node
تحتوي هذه الفئة على طريقة قبول (زائر Nodevisitor)
هناك العديد من أنواع العقدة الفعلية ، ولكن في هذا الوقت من المكالمة الحقيقية ، سوف تمر
Public Void Accept (NodeVisitor Postitor) يلقي الاستثناء {visitor.visit (this) ؛تمرير النوع الحقيقي إلى الزائر ، وسيتم استدعاء طريقة محددة في القاع ، بحيث يمكن للمعلمات أيضًا أن تلعب دورًا حاسمًا.
زيارة باطلة عامة (عقدة العقدة) ترمي Elexception {if (node extorlyof astfunction) {ASTFunction funcnode = (astfunction) node ؛ الطريقة م = فارغة ؛ } آخر إذا (xxx) {} هنا ، سيتم الإعلان عن طرق الزيارة المتعددة ، وستكون الزيارة أعلاه (هذا) موجودة مباشرة على الطريقة المستهدفة.
ما سبق هو التوزيعات المختلفة في Java ونموذج الزوار لتحقيق التوزيع المزدوج من خلال شكل الأنماط. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، يرجى ترك رسالة لي. سوف يرد المحرر على الجميع في الوقت المناسب!