1. وضع الوكيل
الوكيل هو شخص أو مؤسسة تعمل نيابة عن شخص أو مؤسسة أخرى. في بعض الحالات، لا يريد العميل أو لا يمكنه الرجوع إلى كائن مباشرةً، ويمكن أن يعمل كائن الوكيل كوسيط بين العميل والكائن الهدف.
يوفر نمط الوكيل كائنًا وكيلاً لكائن ما، ويتحكم كائن الوكيل في المرجع إلى الكائن الأصلي.
مثال في الحياة الواقعية: أنت مشغول بالعمل الإضافي خلال العام الجديد وليس لديك وقت لشراء تذاكر القطار، ويمكنك في هذا الوقت الاتصال بمركز التذاكر القريب وتطلب منهم شراء تذكرة قطار للعودة إلى الوطن إضافة رسوم العمالة الإضافية. ولكن يجب أن يكون واضحًا أن مركز التذاكر نفسه لا يبيع التذاكر، فقط محطة القطار هي التي تبيع التذاكر بالفعل. يتم تحصيل التذاكر التي يبيعها لك مركز التذاكر من خلال محطة القطار. هذا مهم جدا!
في المثال أعلاه، أنت "العميل"، ومركز التذاكر هو "دور الوكيل"، ومحطة القطار هي "الدور الحقيقي"، ويسمى بيع التذاكر "الدور المجرد"!
مثال على كود JAVA لوضع الوكيل:
الدور المجرد: فئة مجردة أو واجهة
انسخ رمز الكود كما يلي:
com.interfaceBusiness
{
فعل باطل () ؛
}
الدور الحقيقي: ينفذ حقًا واجهة منطق الأعمال
دور الوكيل: لا ينفذ واجهة منطق الأعمال، ولكنه يستدعي الدور الحقيقي لتنفيذها.
انسخ رمز الكود كما يلي:
فئة BusinessImplProxy تنفذ الأعمال
{
BusinessImpl bi;
فعل الفراغ العام ()
{
إذا (ثنائية==خالية)
{
bi = new BusinessImpl();
}
doBefore();
bi.doAction();
doAfter();
}
الفراغ العام doBefore()
{
System.out.println("المعالجة المسبقة!");
}
الفراغ العام doAfter ()
{
System.out.println("ما بعد المعالجة!");
}
}
// فئة الاختبار
اختبار الطبقة
{
الفراغ العام الثابت الرئيسي (String[] args)
{
// يتم تعريف المتغيرات المرجعية على أنها أنواع أدوار مجردة
Business bi = new BusinessImplProxy();
bi.doAction();
}
}
انسخ رمز الكود كما يلي:
<سبان></سبان>
لذلك، بدعم من JVM، يمكن إنشاء فئات الوكيل ("أدوار الوكيل") ديناميكيًا في وقت التشغيل، ويمكننا حل مشكلة توسيع التعليمات البرمجية في وضع الوكيل أعلاه، بعد استخدام الوكيل الديناميكي، لن تكون هناك حاجة إلى "أدوار الوكيل". ليتم إنشاؤه يدويًا، والذي يتم إنشاؤه ديناميكيًا بواسطة JVM في وقت التشغيل عن طريق تحديد ثلاث معلمات: مُحمل الفئة، ومصفوفة الواجهة، ومعالج الاستدعاء.
مثال على رمز JAVA لوضع الوكيل الديناميكي:
انسخ رمز الكود كما يلي:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
// دور مجرد: يدعم تطبيق وكيل Java الديناميكي حاليًا الواجهات فقط ولا يدعم الفئات المجردة
واجهة BusinessFoo
{
باطلة فو ()؛
}
com.interfaceBusinessBar
{
شريط السلسلة (رسالة السلسلة)؛
}
// الدور الحقيقي: تنفيذ أساليب منطق الأعمال حقًا
فئة BusinessFooImpl تنفذ BusinessFoo
{
الفراغ العام foo()
{
System.out.println("BusinessFooImpl.foo()");
}
}
فئة BusinessBarImpl تنفذ BusinessBar
{
شريط السلسلة العامة (رسالة السلسلة)
{
System.out.println("BusinessBarImpl.bar()");
رسالة العودة؛
}
}
// الدور الديناميكي: إنشاء فئة الوكيل ديناميكيًا
تقوم فئة BusinessImplProxy بتنفيذ InvocationHandler
{
publicObject obj;
بيزنس إمبل بروكسي () {
}
BusinessImplProxy(كائن الكائن) {
this.obj = obj;
}
استدعاء الكائن العام (وكيل الكائن، طريقة الطريقة، وسيطات الكائن []) يلقي رميًا
{
نتيجة الكائن = فارغة؛
doBefore();
النتيجة = الأسلوب.invoc(obj,args);
doAfter();
نتيجة الإرجاع؛
}
الفراغ العام doBefore(){
System.out.println("افعل شيئًا قبل منطق الأعمال");
}
الفراغ العام doAfter () {
System.out.println("افعل شيئًا بعد منطق الأعمال");
}
مصنع الكائنات الثابتة العامة (Object obj)
{
فئة cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
}
}
// فئة الاختبار
الفئة العامة DynamicProxy
{
يلقي الفراغ الرئيسي العام (String[] args) القابل للرمي
{
BusinessFooImpl bfoo = new BusinessFooImpl();
BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
bf.foo();
System.out.println();
BusinessBarImpl bbar = new BusinessBarImpl();
BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
String message = bb.bar("Hello,World");
System.out.println(message);
}
}
وصف تدفق البرنامج:
new BusinessFooImpl(); ينشئ "دورًا حقيقيًا"، ويمرره إلى طريقة المصنع BusinessImplProxy.factory()، ثم يقوم بتهيئة "معالج الاستدعاء" - الفئة التي تنفذ InvocationHandler. وتقوم بإرجاع مثيل فئة الوكيل الذي تم إنشاؤه ديناميكيًا، نظرًا لأن "دور الوكيل" يجب أن يطبق أيضًا طريقة منطق الأعمال التي يوفرها "الدور المجرد"، فيمكن تحويله إلى BusinessBar وتعيينه إلى المرجع bb الذي يشير إلى نوع BusinessBar.
تسمح طريقة newProxyInstance(ClassLoader Loader, Class<?>[] Interfaces, InvocationHandler h) للمبرمجين بتحديد المعلمات وإرجاع فئة الوكيل المطلوبة ديناميكيًا، بينما يتم استخدام طريقة الاستدعاء (Object proxy، Method Method، Object[] args) بواسطة يتم استدعاء JVM ديناميكيًا في وقت التشغيل. عند تنفيذ الأسلوب "bb.bar("Hello,World");" ، يقوم JVM ديناميكيًا بتعيين "معالج الاستدعاء"، وتمرير المعلمات إلى الاستدعاء الخارجي، واستدعاء الأسلوب.invoc(obj, args) لتنفيذه فعليًا !
يتم استخدام الأسلوب الثابت BusinessImplProxy.Factory لإنشاء فئات الوكيل ديناميكيًا ("أدوار الوكيل"). يتم إنشاء أدوار الوكيل ديناميكيًا في وقت التشغيل استنادًا إلى واجهات منطق الأعمال المختلفة BusinessFoo وBusinessBar. يمكن تغيير كل من "الدور الملخص" و"دور الوكيل" ومعالج الاستدعاء (الفئة التي تنفذ واجهة InvocationHandler)، لذا فإن الوكيل الديناميكي لـ JAVA قوي جدًا.