يمكن لفهم واستخدام أنماط التصميم أن يزرع عادات البرمجة الموجه نحو الكائنات الجيدة ، وفي التطبيقات الفعلية ، يمكننا الاستمتاع بمتعة كوننا مرتاحين.
Proxy هو نموذج مفيد نسبيًا ، وهناك العديد من المتغيرات. أوضح على النحو التالي: من نقطة البداية إلى هناك طبقة وسيطة بين الوجهات ، بمعنى العامل.
محدد في نمط التصميم: يوفر وكيلًا للكائنات الأخرى للتحكم في الوصول إلى هذا الكائن.
لماذا تستخدم وضع الوكيل
1. آلية التفويض من مستويات مختلفة من التصريح لديهم حقوق وصول مختلفة إلى نفس الكائن. (المستخدمين غير المسجلين) ، وفي Jive يتيح لك هذا التحكم في حقوق الوصول لهذين المستخدمين إلى المنتدى من خلال وكيل مثل Forumproxy.
2. لا يمكن للعميل العمل مباشرة إلى كائن ، ولكن يجب أن يتفاعل مع هذا الكائن.
إعطاء مثالين محددين:
1. إذا كان هذا الكائن صورة كبيرة ويستغرق وقتًا طويلاً لعرضه ، فعندما يتم تضمين الصورة في المستند ، استخدم المحرر أو المتصفح لفتح المستند ، ويجب فتح المستند بسرعة كبيرة ولا يمكنه الانتظار تم الانتهاء من معالجة الصور الكبيرة ، وفي هذا الوقت ، يجب استخدام وكيل الصورة لاستبدال الصورة الحقيقية.
2. إذا كان هذا الكائن على خادم بعيد على الإنترنت ويقوم بتشغيل هذا الكائن مباشرةً ، فقد يكون بطيئًا بسبب سرعة الشبكة ، فيمكننا استخدام الوكيل لاستبدال هذا الكائن أولاً.
باختصار ، يتمثل المبدأ في أنه بالنسبة للكائنات ذات النفقات العامة العالية ، يتم إنشاؤها فقط عند استخدامها. لذلك ، يعتقد بعض الناس أن جافا تستهلك ذاكرة الموارد ، وأعتقد أن هذا له علاقة بفكرة البرمجة.
كيفية استخدام وضع الوكيل
أخذ نظام Jive Forum كمثال ، هناك العديد من أنواع المستخدمين الذين يزورون نظام المنتدى: المستخدمون العاديون المسجلون ، ومديري المنتدى ، ومديري النظام ، والسياح. فقط من خلال تسجيل مستخدم عادي يمكن أن يتكلم.
المنتدى هو الواجهة الأساسية لـ Jive.
يتم تعريف المستخدمين الذين لديهم مستويات مختلفة من الأذونات في المنتدى:
نسخة الكود كما يلي:
تنفذ FormperMissions الفئة العامة القابلة للتخزين {
/**
* إذن لقراءة الكائن.
*/
القراءة النهائية الثابتة العامة = 0 ؛
/**
* إذن لمسؤول النظام بأكمله.
*/
ثابت عام int int system_admin = 1 ؛
/**
* إذن للمسؤول منتدى معين.
*/
Form int static int static int forum_admin = 2 ؛
/**
* إذن لمسؤول مستخدم معين.
*/
static int user_admin user_admin = 3 ؛
/**
* إذن للمسؤول مجموعة معينة.
*/
ثابت عام int group_admin = 4 ؛
/**
* إذن إلى المواضيع الحديثة.
*/
الثابتة العامة int intera_threads = 5 ؛
/**
* إذن لإنشاء موضوع جديد.
*/
int static int int int_thread = 6 ؛
/**
* إذن لإنشاء رسالة جديدة.
*/
int static int int create_message = 7 ؛
/**
* إذن للرسائل الحديثة.
*/
الثابتة العامة النهائية int medera_messages = 8 ؛
.....
ISSYSTEMORFORUMADMIN ()
إرجاع (القيم [forum_admin] || القيم [system_admin]) ؛
}
.....
}
لذلك ، ترتبط أذونات التشغيل المختلفة في المنتدى بمستوى المستخدم المحدد من قبل ForumperMissions. على سبيل المثال ، عند تعديل اسم المنتدى ، يمكن فقط لمدير المنتدى أو مدير النظام تعديله ، فإن الرمز هو كما يلي:
نسخة الكود كما يلي:
الطبقة العامة forumproxy تنفذ المنتدى {
أذونات FormperMissions الخاصة ؛
منتدى المنتدى الخاص ؛
this.authorization = إذن ؛
عام forumproxy (منتدى المنتدى ، تفويض التفويض ،
أذونات ForumperMissions) {
this.forum = forum ؛
this.authorization = إذن ؛
this.permissions = أذونات ؛
}
.....
public void setName (اسم السلسلة) يلقي unauntirizedexception ،
ForumAlReadyExistsexception {
// فقط يمكن للمسؤول عن النظام أو المنتدى تعديل الاسم إذا (الأذونات.
Forum.SetName (name) ؛
}
آخر {
رمي جديد غير مصرح به من غير مصرح به () ؛
}
}
...
}
DBForum هو التنفيذ الحقيقي لمنتدى الواجهة.
نسخة الكود كما يلي:
الطبقة العامة DBForum تنفذ منتدى ، مخبأ {
...
public void setName (اسم السلسلة) يلقي ForumalReadyExiStsexception {
....
this.name = name ؛
// هنا يمكنك حقًا حفظ الاسم الجديد إلى قاعدة البيانات إلى SaveTodb () ؛
....
}
...
}
كلما تم إشراك اسم المنتدى ، يجب أن تتعامل برامج أخرى مع Forumproxy.
في التطبيقات اليومية ، من المحتم أن يشارك في نظام تخويل النظام أو نظام الأمن دائمًا.
دعنا نستمر في التحدث بشكل أعمق مع Jive ، وسيشارك نموذج المصنع أدناه.
نعلم بالفعل أن استخدام المنتدى يتطلب استخدام Forumproxy. يتم استخدام Singleton هنا (أيضًا أحد أنماط التصميم) ، GetInstance () Returns ForumFactoryProxy.
لماذا لا ترجع ForumFactory ، ولكن Return ForumFactory Application ForumFactoryProxy؟ السبب واضح ، ومن الضروري تحديد ما إذا كان المنتدى لديه إذن لإنشائه من خلال الوكيل.
في Forumfactoryproxy نرى الرمز على النحو التالي:
نسخة الكود كما يلي:
يمتد Forumfactoryproxy من الطبقة العامة {
مصنع ForumFactory المحمي ؛
إذن إذن محمي ؛
أذونات ForumperMissions المحمية ؛
ForumFactoryproxy (إذن إذن ، مصنع ForumFactory ، أذونات ForumperMissions) {
this.factory = المصنع ؛
this.authorization = إذن ؛
this.permissions = أذونات ؛
}
المنتدى العام CreateForum (اسم السلسلة ، وصف السلسلة)
رمي غير مصرح به ، FormalReadyExistsexception {
// فقط مسؤولي النظام يمكنهم إنشاء منتدى
if (أذونات.
Forum newForum = factory.createforum (الاسم ، الوصف) ؛
إرجاع جديد forumproxy (Newforum ، التفويض ، الأذونات) ؛
}
آخر {
رمي جديد غير مصرح به من غير مصرح به () ؛
}
}
}
طريقة CreateForum إرجاع forumproxy.
لاحظ أن هناك بروكسي نوعان هنا: forumproxy و forumfactoryproxy. يمثل مسؤوليتين مختلفتين: استخدام المنتدى وإنشاء منتدى. بالنسبة إلى سبب فصل الكائنات عن إنشاء كائنات ، وهذا هو السبب في استخدام نمط المصنع: إنه لـ "التغليف" و "الإرسال". بمعنى آخر ، تكون الوظائف عازبة قدر الإمكان لتسهيل الصيانة والتعديل.
يعتمد إنشاء آخر واستخدامه في نظام Jive Forum على فكرة المنتدى.
ناقشنا أعلاه كيفية استخدام الوكيل للوصول إلى آلية التفويض. يعد نسخ كائن ضخم ومعقد عملية مكلفة للغاية. استخدم وكيلًا لتأخير عملية النسخ هذه.
على سبيل المثال: لدينا مجموعة كبيرة ، مثل علامة التجزئة ، وسيقوم العديد من العملاء بالوصول إليها بشكل متزامن في نفس الوقت. يحتاج أحد العملاء الخاصين إلى إجراء الحصول على البيانات المستمرة ، وفي هذا الوقت ، يتعين على العملاء الآخرين إضافة أو حذف الأشياء إلى علامة التصنيف.
الحل الأكثر مباشرة هو: استخدم قفل المجموعة ، ودع هذا العميل الخاص يحصل على هذا القفل ، وأداء الحصول على البيانات المستمرة ، ثم حرر القفل.
نسخة الكود كما يلي:
public foftches (Hashtable HT) {
متزامن (ht) {
// إجراء محدد لاكتساب البيانات ...
}
}
ومع ذلك ، قد تقفل هذه الطريقة المجموعة لفترة طويلة ، ولن يتمكن العملاء الآخرون من الوصول إلى المجموعة خلال هذه الفترة.
الحل الثاني هو إغلاق المجموعة ، ثم السماح للبيانات المستمرة بالحصول على عملية التجميع للاستنساخ. يعتمد هذا الحل على حقيقة أن المجموعة قابلة للاستنساخ ويجب أن تكون هناك طريقة لتوفير استنساخ عميق. يوفر Hashtable طريقة استنساخه الخاصة ، ولكن ليس استنساخ كائنات المفتاح والقيمة.
نسخة الكود كما يلي:
public foftches (Hashtable HT) {
hashttable newht = (hashtable) ht.clone () ؛
}
تأتي المشكلة مرة أخرى.
الحل النهائي: يمكننا الانتظار حتى يكمل العملاء الآخرون التعديل قبل الاستنساخ ، أي أن هذا العميل الخاص يقوم أولاً بإجراء سلسلة من عمليات الحصول على البيانات عن طريق استدعاء طريقة تسمى Clone. ولكن في الواقع ، لم يتم بالفعل نسخ كائن حتى يقوم العملاء الآخرون بتعديل مجموعة الكائنات.
قم بتنفيذ هذا الحل باستخدام الوكيل ، وهو عملية النسخ على الكتابة.
لدى Proxy مجموعة واسعة من التطبيقات.