قم أولاً بتحليل الأدوار الثلاثة في نموذج الوكيل الديناميكي:
1. الدور المجرد: في الوكيل الثابت يمكن أن يكون فئة مجردة، ولكن في الوكيل الديناميكي يمكن أن يكون واجهة فقط
2. الدور الحقيقي: يقوم فقط بتنفيذ الأساليب في الدور المجرد.
3. دور الوكيل: الشيء الأكثر إثارة للاشمئزاز هو دور الوكيل في الوكيل الديناميكي. يجب أن يحمل إشارة إلى الشخصية الحقيقية.
يتضمن واجهة وفئة وواجهة InvocationHandler وفئة الوكيل. وفقًا لوثائق JDK، يتم تنفيذ واجهة InvocationHandler بواسطة فئة، ومثيل هذه الفئة هو كائن المعالج المطابق لكائن الوكيل. عند استدعاء طريقة لكائن الوكيل، سيتم تشفير الطريقة وتعيينها لطريقة الاستدعاء لكائن المعالج المقابل لها للاتصال بها!
انسخ رمز الكود كما يلي:
// الدور الملخص:
الواجهة العامة AbstractRole
{
عرض الفراغ العام ()؛
}
// الشخصية الحقيقية:
تقوم الطبقة العامة RealRole بتنفيذ AbstractRole
{
@تجاوز
public void show(){ System.out.println("أرني منزلك");
}
// دور الوكيل:
// أعتقد أن هذا مجرد وكيل زائف، لقد توصلت إلى الوكيل الزائف بنفسي = =! ، لأنه في الواقع المعالج المطابق للوكيل
يقوم معالج الفئة العامة بتنفيذ InvocationHandler
{
Private Object realRole; // يحتاج دور الوكيل إلى مرجع للدور الحقيقي. إذا تم تعريفه كنوع كائن، فهو عالمي.
المعالج العام (الدور الحقيقي للكائن)
{ this.realRole = realRole }
@تجاوز
استدعاء الكائن العام (وكيل الكائن، طريقة الطريقة، وسيطة الكائن [])
{
System.out.println("أعطني أموالك"); // هذه وظيفة إضافية يضيفها دور الوكيل نفسه.
Method.invoc(this.realRole, args); // استدعاء طريقة الدور الحقيقي من خلال الانعكاس
System.out.println("حسنًا...المنزل لك");// هذه وظيفة إضافية يضيفها دور الوكيل نفسه.
}
public Object Factory()// أنشئ دور الوكيل الحقيقي من خلال طريقة المصنع
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); // تحتوي طريقة newProxyInstance في الوكيل على ميزتين مهمتين للغاية! الأول هو إنشاء فئة وكيل ديناميكيًا، إذا كان الإخراج يبدو أنه فئة تسمى $Proxy0؛ والثاني هو إنشاء مثيل من خلال الفئة التي تم إنشاؤها ديناميكيًا.
}
}
//عميل:
اختبار الطبقة العامة
{
الفراغ العام الثابت الرئيسي (String[] args)
{
RealRole realRole = new RealRole();// ما هو الدور الحقيقي الذي تريد تمثيله، ما عليك سوى إنشاء دور حقيقي جديد
Handler Handler = new Handler(realRole);// يتم هنا إنشاء المعالج المطابق لفئة الوكيل.
AbstractRole proxy = (AbstractRole)handler.factory();// إنشاء كائنات الوكيل من خلال أساليب المصنع
}
}
ربما تتساءل كيف يمكن تحويل دور الوكيل هنا بالقوة إلى دور مجرد؟ السبب يكمن في طريقة newProxyInstance. هذه الطريقة مثيرة للاهتمام للغاية. كما ذكرنا سابقًا، ستقوم تلقائيًا بإنشاء فئة ثم إنشاء كائن وكيل من خلال الفئة. في الواقع، تطبق هذه الفئة فئة الدور المجرد لماذا؟ لأن المعلمة الثانية قد حددت بالفعل الواجهات التي تنفذها. حتى تتمكن من فرض النقل، بعد النقل القسري، يمكنك استدعاء الأساليب في الدور المجرد.
proxy.show();// حسنًا! انتبه إلى هذه الجملة التي حددتها باللون الأحمر في البداية، "سيتم تشفير هذه الطريقة وتعيينها لطريقة الاستدعاء لكائن المعالج المقابل لها للاتصال بها!"، بسبب هذه الجملة، تكون طريقة العرض proxy.show() تم تمريره إلى طريقة الاستدعاء في كائن المعالج، بالطبع يتم اتباع معلمات طريقة العرض أيضًا، لكن طريقة العرض هنا لا تحتوي على معلمات. لذلك تستدعي جملة proxy.show() طريقة الاستدعاء في كائن المعالج.