يعرف جميع الوكلاء أنه عندما تذهب للتسوق ، هناك العديد من الوكلاء ، وهم يبيعون فقط المنتجات الأصلية. على سبيل المثال ، إذا كنت ترغب في شراء اللحوم كل يوم ، يتم رفع الخنزير من قبل المزارع ، ولكن إذا كنت تشتري اللحوم من الجزار ، فيمكن اعتبار الجزار وكيلًا. ثم لماذا تحتاج إلى وكيل؟ الخنازير ثم ذبحهم.
كيفية تنفيذ هذه العملية مع الكود: يجب أن نستخدم ثلاث فئات: الجزار ، والمزارع للإشارة إليك ، الجزار ، والمزارعين على التوالي. من بينها ، يوفر المزارع أيضًا طريقة لشراء اللحوم لاستدعاء الجزار.
نسخة الكود كما يلي:
فئة المزارع {
Public Int Buymeat (int money) {
اللحم int = 0 ؛
// ... اللحوم = *** ؛
إرجاع اللحوم
}
}
يوفر لك الجزار طريقة لشراء اللحوم. الرمز كما يلي:
نسخة الكود كما يلي:
فئة جزار {
Public Int Buymeat (int money) {
Farmer Farmer = New Farmer () ؛
INT MEAT = FARMER.BUYMEAT (المال) ؛
اللحوم += 5 ؛
إرجاع اللحوم
}
}
ومع ذلك ، فإن الرمز الذي تشتريه من اللحوم من الجزار يصبح مثل هذا:
نسخة الكود كما يلي:
الفصل لك {
عمل باطل عام () {
int youmoney = 10 ؛
بوتشر = الجزار الجديد () ؛
int meat = butcher.buymeat (youmoney) ؛
System.out.println ("طبخ اللحم ، الوزن:" + اللحوم) ؛ // قمت بطهيه.
}
}
يمكننا أيضًا تحسين هذا البرنامج. إنه جزار أو مزارع.
نسخة الكود كما يلي:
الفصل لك {
عمل باطل عام () {
int youmoney = 10 ؛
Peldar Peldar = New Butcher () ؛
int meat = peldar.buymeat (youmoney) ؛
System.out.println ("طبخ اللحوم ، الوزن:" + اللحوم) ؛
}
}
واجهة Peldar {
int buymeat (int money) ؛
}
يقوم جزار الفئة بتنفيذ Peldar {
@تجاوز
Public Int Buymeat (int money) {
Farmer Farmer = New Farmer () ؛
INT MEAT = FARMER.BUYMEAT (المال) ؛
اللحوم += 5 ؛
إرجاع اللحوم
}
}
مزارع الفئة ينفذ Peldar {
@تجاوز
Public Int Buymeat (int money) {
اللحم int = 0 ؛
// ... اللحوم = *** ؛
إرجاع اللحوم
}
}
هذا هو الوكيل.
ومع ذلك ، يطلق على هذا الوكيل الثابت ، لأن فئة الوكيل (فئة الجزار) كتبت بواسطتك ، والبلاؤ الديناميكي هو توليد فئة وكيل مكافئ عند تشغيل Java. على الرغم من أن الفصل يتم إنشاؤه ديناميكيًا ، إلا أن رمز قتل الخنازير وحقن الماء لا يزال بحاجة إلى كتابة فئة بعد الآن. أين تكتبه؟
نسخة الكود كما يلي:
الواجهة العامة InvocationHandler {
استدعاء الكائن العام (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) رمي رمي ؛
}
ماذا تعني المعلمات؟
نسخة الكود كما يلي:
الواجهة العامة InvocationHandler {
الكائن العام استدعاء (جزار الكائن ، Method Buymeat ، كائن [] المال) رمي رمي ؛
}
المعلمة الأولى هي كائن لفئة الوكيل التي تم إنشاؤها تلقائيًا (كائن من فئة الجزار التي يتم إنشاؤها تلقائيًا) ، والمعلمة الثانية هي كائن الطريقة التي يتم استدعاؤها (كيف تحتوي الطريقة على كائنات ، انظر الجافا آلية الانعكاس). لذا فإن رمز قتل الخنازير وملء الماء يصبح هكذا عند كتابته:
نسخة الكود كما يلي:
InvocationHandler MinvocationHandler = New InvocationHandler () {
@تجاوز
الكائن العام استدعاء (جزار الكائن ، طريقة شراء ، كائن [] args) رمي {
Farmer Farmer = New Farmer () ؛
INT MEAT = (عدد صحيح) buymeat.invoke (مزارع ، args) ؛
اللحوم += 5 ؛
إرجاع اللحوم
}
} ؛
هذا غير متناسق مع الطريقة التقليدية لاستدعاء طريقة شراء لحوم المزارع. قد تسأل إذن لماذا لا تسميها مباشرة لديك العديد من كائنات المزارعين ، حتى لا كائنات المزارعين ، يمكن استخدامها كمثيل لواجهة معينة (تم تحديد الواجهة أدناه ، دعنا نسميها أولاً) ، ويمكن تمريرها كمعلمات ثم تدعوها الطريقة. الآن دعنا نلقي نظرة على كيفية إنشاء فئة بالوكالة.
نسخة الكود كما يلي:
كائن ثابت عام NewProxyInstance (Loader ClassLoader ، فئة <؟> [] واجهات ، InvocationHandler H)
يلقي غير unalfalargumentException
اشرح المعلمات. هي الواجهة التي يتم إنشاؤها حديثًا. في الصفيف ، والمكالمة المذكورة في الفقرة السابقة هي مشكلة الفشل واضحة أيضًا. المعلمة الثالثة ، invocationHandler ، مفهومة بشكل أفضل ، أي ، طالما أن أي طريقة في فئة الوكيل تسمى ، سيتم إخطار InvOcketHandler. الرمز الكامل مكتوب أدناه:
نسخة الكود كما يلي:
الفصل لك {
عمل باطل عام () {
int youmoney = 10 ؛
peldar peldarproxy = (peldar) proxy.newproxyinstance (getClass (). getClassloader () ، فئة جديدة [] {peldar.class} ، minvocationHandler) ؛
int meat = peldarproxy.buymeat (youmoney) ؛
System.out.println ("طبخ اللحم ، الوزن:" + اللحوم) ؛
}
InvocationHandler MinvocationHandler = New InvocationHandler () {
@تجاوز
استدعاء الكائن العام (جزار الكائن ، Method Buymeat ، Object [] args)
رميات قابلة للتطبيق {
Farmer Farmer = New Farmer () ؛
int Meat = (integer) buymeat.invoke (مزارع ، args) ؛
اللحوم += 5 ؛
إرجاع اللحوم
}
} ؛
}
واجهة Peldar {
int buymeat (int money) ؛
}
مزارع الفئة ينفذ Peldar {
@تجاوز
Public Int Buymeat (int money) {
اللحم int = 0 ؛
// ... اللحوم = *** ؛
إرجاع اللحوم
}
}
هنا ، يتم إنشاء فئة بالوكالة في فئة You.