مفهوم
وضع الوكيل: وضع الوكيل هو في الواقع فئة وكيل إضافي لإجراء بعض العمليات على الكائن الأصلي. على سبيل المثال ، نحتاج في بعض الأحيان إلى توظيف محام عندما نذهب إلى دعوى قضائية ، لأن المحامين لديهم خبرة في القانون ويمكنهم العمل والتعبير عن أفكارنا لنا. هذا ما تعنيه الوكالة. ينقسم وضع الوكيل إلى فئتين: 1. الوكيل الثابت (لا تستخدم الأساليب في JDK) ؛ 2. الوكيل الديناميكي (باستخدام InvocationHandler و Proxy في JDK).
يتم إنشاء الوكيل الثابت من قبل المبرمجين أو الأدوات لإنشاء رمز المصدر لفئة الوكيل ، ثم تجميع فئة الوكيل. يعني ما يسمى الثابت أن ملف Bytecode لفئة الوكيل موجود بالفعل قبل تشغيل البرنامج ، ويتم تحديد العلاقة بين فئة الوكيل وفئة المندوب قبل التشغيل.
يتم إنشاء رمز المصدر لفئة الوكيل الديناميكي ديناميكيًا بواسطة JVM وفقًا للانعكاس والآليات الأخرى أثناء تشغيل البرنامج ، لذلك لا يوجد ملف ثنائي رمز من فئة الوكيل. يتم تحديد العلاقة بين فئة الوكيل وفئة المفوض عند تشغيل البرنامج.
مثال
هنا نعطي مثالا على الوكيل الثابت:
مخطط الفصل:
/ *** واجهة gamer**/ واجهة عامة igameplayer {// تسجيل الدخول إلى تسجيل الدخول إلى void game (مستخدم سلسلة ، كلمة مرور السلسلة) ؛ // Kill Monsters ، الميزة الرئيسية للألعاب العامة عبر الإنترنت باطلة KillBoss () ؛ // ترقية public void upgrade () ؛ } / *** gamer**/ public class gameplayer تنفذ igameplayer {private string name = "" ؛ // تمرير الاسم من خلال Gameplayer Constructor Public (String _name) {this.name = _name ؛ } // عند قتال الوحوش ، الأكثر توقعًا هو قتل الفراغ العام القديم KillBoss () {system.out.println (this.name + "Kill Monsters!") ؛ } // يجب عليك تسجيل الدخول قبل إدخال اللعبة. هذا شرط ضروري. تسجيل الدخول الفراغ العام (سلسلة المستخدم ، كلمة مرور السلسلة) {system.out.println ("اسم تسجيل الدخول هو" + user + "role" + this.name + "login بنجاح!") ؛ } // الترقية ، هناك العديد من الطرق للترقية ، وإنفاق الأموال للشراء ، والقيام بالمهام هو أيضًا نوع من ترقية الفراغ العام () {system.out.println (this.name + "مستوى آخر!") ؛ }} /*** لا يكون العميل مرئيًا لكائن الوكيل*/gameplayerProxy public {private igameplayer gameplayer = null ؛ // proxy object // pass ther the plameplayer to to to to to to to to to to plameer explayer (username) ؛ } // المستلم لقتل Monsters public void KillBoss () {this.gameplayer.killboss () ؛ } // المستلم لتسجيل الدخول إلى تسجيل الدخول العام (مستخدم سلسلة ، كلمة مرور السلسلة) {this.gameplayer.login (المستخدم ، كلمة المرور) ؛ }. }} /** العميل غير مرئي لكائن الوكيل*/public class glayerproxy2 ينفذ igameplayer {private igameplayer gameplayer = null ؛ // proxy object // pass ther the procentor to to gameplayer (username) } // المتلقي Kill Monsters public void KillBoss () {this.gameplayer.killboss () ؛ }. this.gameplayer.login (المستخدم ، كلمة المرور) ؛ } // الممارسة الترقية () public void upgrade () {this.gameplayer.upgrade () ؛ system.out.println ("وقت الترقية هو:" + تاريخ جديد (). tolocalestring ()) ؛ }} /** العميل غير مرئي لكائن الوكيل*/ gameplayerProxy3 {private IgamePlayer Gameplayer ؛ // تمرير كائن الوكيل (الوكيل) من خلال Constructor Public GlayerProxy3 (iGamePlayer Gameplayer) {this.gameplayer = gameplayer ؛ System.out.println ("أنا وكيل ، الشخصية التي ألعبها هي شخص آخر ، ويمكن تمريرها ديناميكيًا") ؛ } public igameplayer getProxy () {return (igameplayer) proxy.newproxyinstance (this.getClass (). } الفئة الخاصة myinvocationHandler تنفذ invocationHandler {Override الكائن العام الاحتجاج (وكيل الكائن ، الطريقة ، الكائن [] args) يلقي رمي {if (method.getName (). equals ("login")) {system.out.println ("localestring ()") ؛ } if (method.getName (). يساوي ("ترقية")) {system.out.println ("وقت الترقية هو:" + تاريخ جديد (). tolocalestring ()) ؛ } method.invoke (gameplayer ، args) ؛ العودة لاغية. }}} اختبار الفئة العامة {public static void main (string [] args) { /** الوكيل الثابت العادي: لا يعرف العميل كائن الوكيل ، ويكمل كائن الوكيل استدعاء الوظيفة* / igameplayer proxy = new GlayPlayerProxy ("x") ؛ System.out.println ("وقت البدء هو:" + تاريخ جديد (). tolocalestring ()) ؛ proxy.login ("Zhangsan" ، "ABCD") ؛ proxy.killboss () ؛ proxy.upgrade () ؛ System.out.println ("وقت النهاية هو:" + تاريخ جديد (). tolocalestring ()) ؛ system.out.println () ؛ /** يعزز كائن الوكيل وظيفة كائن الوكيل*/ igameplayer proxy2 = new GamePlayerProxy2 ("M") ؛ proxy2.login ("lisi" ، "efg") ؛ proxy2.killboss () ؛ proxy2.upgrade () ؛ system.out.println () ؛ /** الوكيل الديناميكي: استخدم invocationHandler المقدمة من JDK لتعكس طريقة استدعاء كائن الوكيل* إلى جانب java.reflect.proxy لإنشاء كائنات وكيل* يمكن تعزيزها ديناميكيًا للكائن الوكل يتم تنفيذ (إشعار) * في GamePlayerProxy3 ، إنه وقت بدء الإخطار عندما تسمى الطريقة تسجيل الدخول ، ووقت نهاية الإخطار عند الترقية */ gameplayerProxy3 Dynamic = new GamePlayerProxy3 (لعبة جديدة ("Y") ؛ igameplayer DynamicPlayer = dynamic.getProxy () ؛ DynamicPlayer.login ("Wangwu" ، "1234") ؛ DynamicPlayer.KillBoss () ؛ DynamicPlayer.upgrade () ؛ /** الموجه نحو التحرير: يجب إضافة بعض منطق الأعمال المماثل إلى العديد من الأماكن ، حتى نتمكن من استخراجه في القسم ، وهو قسم المعاملات: مثل قسم السجل ، قسم الإذن ، قسم الأعمال*/}} مطبعة:
وقت البدء هو: 2014-10-8 17:19:05 تم تسجيل الدخول إلى Zhangsan مع Zhangsan! X يقاتل الوحوش! تمت ترقية X إلى مستوى آخر! وقت الانتهاء هو: 2014-10-8 17:19:05 وقت تسجيل الدخول هو: 2014-10-8 17:19:05 دور تسجيل الدخول M مع اسم Lisi تم تسجيل الدخول بنجاح! م يقاتل الوحوش! تمت ترقية M إلى مستوى آخر! وقت الترقية هو: 2014-10-8 17:19:05 أنا لاعب وكيل. الشخصية التي ألعبها هي شخص آخر ، ويمكنني تمريرها ديناميكيًا لتسجيل الدخول. الوقت هو: 2014-10-8 17:19:05 تم تسجيل حرف تسجيل الدخول Y باسم Wangwu بنجاح! y تقاتل الوحوش! وقت الترقية هو: 2014-10-8 17:19:05 Y تمت ترقيته إلى مستوى آخر!
ميزة
(1) دور المسؤوليات الواضحة هو تحقيق منطق الأعمال الفعلي ، ولا يتعين عليك الاهتمام بشؤون أخرى غير مسؤولة. يمكنك إكمال معاملة من خلال وكيل لاحق. النتيجة المصاحبة هي برمجة موجزة وواضحة.
(2) يمكن أن يكون كائن الوكيل بمثابة وسيط بين العميل والكائن الهدف ، والذي يلعب دورًا ويحمي الكائن الهدف.
(3) قابلية التوسع عالية