يستخدم وضع الوكيل كائن الوكيل لإكمال طلب المستخدم وحظر وصول المستخدم إلى الكائن الحقيقي.
يحتوي وضع الوكيل على العديد من الاستخدامات ، مثل لأسباب أمنية ، من الضروري منع العميل من الوصول مباشرة إلى الكائن الحقيقي ؛ أو في المكالمات عن بُعد ، يجب استخدام كائن الوكيل للتعامل مع التفاصيل الفنية في الطريقة البعيدة ؛ أو من أجل تحسين النظام ، يتم تغليف الكائن الحقيقي لتحقيق الغرض من تأخير التحميل.
عند بدء تشغيل النظام ، يمكن لفصل الطريقة التي تستهلك معظم الموارد باستخدام وضع الوكيل تسريع سرعة بدء تشغيل النظام وتقليل وقت انتظار المستخدم. عندما يقوم المستخدم فعليًا بالاستعلام ، تقوم فئة الوكيل بتحميل الفئة الحقيقية لإكمال طلب المستخدم. هذا هو الغرض من استخدام وضع الوكيل لتحقيق التحميل كسول.
1. تنفيذ الوكيل الثابت:
واجهة الموضوع:
الواجهة العامة idbquery {string request () ؛ } الموضوع الحقيقي:
الفئة العامة dbquery تنفذ idbquery {public dbquery () {try {thread.sleep (10000) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} request request () {return "string request" ؛ }} فئة الوكيل:
الطبقة العامة idbqueryproxy تنفذ idbquery {private dbquery dbquery ؛ طلب السلسلة العامة () {if (dbquery == null) dbquery = new dbquery () ؛ إرجاع dbquery.request () ؛ }} أخيرًا ، الوظيفة الرئيسية:
Public Class ProxyText {public static void main (string [] args) {idbquery dbquery = new IdBqueryProxy () ؛ System.out.println (dbquery.request ()) ؛ }}لاحظ أن فئة الوكيل الثابتة هي واجهة شائعة للفئات الحقيقية للتنفيذ ، وتشير فئة الوكيل إلى كائنات فئة حقيقية ، وتضع العمليات المستهلكة للوقت في طريقة فئة الوكيل لتنفيذها.
الوكيل الديناميكي:
الوكيل الديناميكي هو عند التشغيل ، ويقوم بإنشاء فئات الوكيل ديناميكيًا. وهذا هو ، يتم إنشاء رمز Bytecode لفئة الوكيل وتحميله في وقت التشغيل. بالمقارنة مع العوامل الثابتة ، لا تحتاج العوامل الديناميكية إلى توخي الحذر من تغليف فئة تغليف متطابقة تمامًا للغرض الحقيقي. إذا كان هناك العديد من واجهات الموضوع ، فمن المزعج كتابة طريقة وكيل لكل واجهة. إذا تغيرت الواجهة ، يجب تغيير كل من الفئة الحقيقية وفئة الوكيل ، وهو ما لا يفضي إلى صيانة النظام ؛ ثانياً ، يمكن تشغيل طرق توليد بعض العوامل الديناميكية في وقت التشغيل ، وهو منطق تنفيذ فئة وكيل محدد ، وبالتالي تحسين مرونة النظام.
واجهة الموضوع:
الواجهة العامة idbquery {string request () ؛ } JDK Proxy Class:
الطبقة العامة jdbdbqueryhandler تنفذ invocationHandler {idbquery idbquery = null ؛ Override Public Object invoke (Proxy Object ، method ، Object [] args) remable {if (idbquery == null) {idbquery = new dbquery () ؛ } إرجاع idbquery.request () ؛ } idbquery ثابت عام createjdbproxy () {idbquery jdkproxy = (idbquery) proxy.newproxyinstance (classloader.getSystemClasslasslader () ، فئة جديدة [] System.out.println ("jdbdbqueryHandler.CreateJdBproxy ()") ؛ إرجاع jdkproxy ؛ }} الوظيفة الرئيسية:
Public Class proxytext {public static void main (string [] args) {idbquery idbquery = jdbdBqueryHandler.CreateJdBproxy () ؛ System.out.println (idbquery.request ()) ؛ }}بالإضافة إلى ذلك ، يمكنك أيضًا استخدام الوكيل الديناميكي CGLIB و Javassist لتشبه الوكيل الديناميكي JDK ، لكن عملية إنشاء فئة JDK الديناميكية هي الأسرع ، لأن طريقة الاختلاف المدمجة () يتم تعريفها على أنها تنفيذ أصلي ، وبالتالي فإن أدائها أفضل من غيرها. في وظائف الدعوات الخاصة بفئات الوكيل ، فإن الوكيل الديناميكي لـ JDK ليس جيدًا مثل الوكيل الديناميكي Cglib و Javassist ، في حين أن الوكيل الديناميكي Javassist لديه أسوأ جودة أداء ، وهو أسوأ من تنفيذ JDK. في تطبيقات التطوير الفعلية ، تكون طريقة استدعاء فئة الوكيل أعلى بكثير من تردد التوليد الفعلي لفئة الوكيل ، وبالتالي فإن طريقة استدعاء أداء الوكيل الديناميكي يجب أن تصبح محور الأداء. يوضح الوكيل الديناميكي JDK أن فصول الوكيل والمواضيع الحقيقية تنفذ واجهات موحدة ، وأن الوكيل الديناميكي CGLIB و Javassist ليس له مثل هذه المتطلبات.
في Java ، ينطوي تنفيذ الوكيل الديناميكي على استخدام charloader. أخذ CGLIB كمثال ، تم وصف وصف موجز لعملية تحميل الفئات الديناميكية. باستخدام CGLIB لإنشاء وكيل ديناميكي ، تحتاج أولاً إلى إنشاء مثيل من فئة المحسن وصياغة فئة رد الاتصال لمعالجة أعمال الوكيل. في طريقة المحسن. ثم استدعاء methodutils.defineclass () طريقة ، ومن خلال الانعكاس ، call classloader.defineclass () طريقة لتحميل البرقط في جهاز تحميل classload لإكمال تحميل الفئة. أخيرًا ، من خلال طريقة الانعكاس البعض الآخر يختلف عن تفاصيل العملية ، ولكن منطق التوليد هو نفسه.
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.