نمط الوكيل
في برمجة الحاسوب ، يُعدّ نمط الوكيل نمطًا لتصميم البرمجيات ، وهو عبارة عن فئة تعمل كواجهة لشيء آخر. يمكن للوكيل أن يتصل بأي شيء: اتصال شبكي، أو كائن كبير في الذاكرة، أو ملف، أو أي مورد آخر مكلف أو مستحيل التكرار. باختصار، الوكيل هو كائن مُغلِّف أو وكيل يستدعيه العميل للوصول إلى الكائن الأصلي الذي يعمل في الخلفية. يمكن أن يقتصر استخدام الوكيل على إعادة التوجيه إلى الكائن الأصلي، أو يمكن أن يوفر منطقًا إضافيًا. في الوكيل، يمكن توفير وظائف إضافية، مثل التخزين المؤقت عندما تكون العمليات على الكائن الأصلي مُستهلكة للموارد، أو التحقق من الشروط المسبقة قبل استدعاء العمليات على الكائن الأصلي. بالنسبة للعميل، يُشبه استخدام كائن الوكيل استخدام الكائن الأصلي، لأن كلاهما يُطبِّق نفس الواجهة.
ملخص
يُعد نمط تصميم الوكيل أحد أنماط تصميم GoF الثلاثة والعشرين المعروفة التي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برمجيات كائنية التوجه مرنة وقابلة لإعادة الاستخدام ، أي كائنات يسهل تنفيذها وتغييرها واختبارها وإعادة استخدامها. [ 1 ]
مشكلة
يُستخدم نمط تصميم الوكيل لحل مثل هذه المشاكل: [ 2 ]
- ينبغي التحكم في الوصول إلى الكائن.
- ينبغي توفير وظائف إضافية عند الوصول إلى عنصر ما.
عند الوصول إلى الأشياء الحساسة، على سبيل المثال، ينبغي أن يكون من الممكن التحقق من أن العملاء لديهم حقوق الوصول اللازمة.
حل
Proxyقم بتعريف كائن منفصل
- يمكن استخدامه كبديل لكائن آخر (
Subject)، و - يُنفذ وظائف إضافية للتحكم في الوصول إلى هذا الموضوع.
وهذا يجعل من الممكن العمل من خلال Proxyكائن ما لأداء وظائف إضافية عند الوصول إلى موضوع ما، مثل التحقق من حقوق الوصول للعملاء الذين يصلون إلى كائن حساس.
لكي يعمل الوسيط كبديل عن المستخدم الأصلي، يجب أن يُنفذ الواجهة Subject. لا يستطيع العملاء التمييز بين التعامل مع المستخدم الأصلي أو مع وسيطه.
انظر أيضًا إلى مخطط فئات وتسلسل UML أدناه.
بناء
فئات UML ومخطط التسلسل

في مخطط فئات UML أعلاه ، تُنفذ الفئة الواجهة بحيث يمكنها أن تعمل كبديل للكائنات. وتحتفظ بمرجع ( ) إلى الكائن المُستبدل ( ) حتى تتمكن من توجيه الطلبات إليه ( ).ProxySubjectSubjectrealSubjectRealSubjectrealSubject.operation()
يوضح مخطط التسلسل التفاعلات أثناء التشغيل: Clientيعمل الكائن من خلال Proxyكائن يتحكم في الوصول إلى RealSubjectكائن آخر. في هذا المثال، يقوم الكائن الأول Proxyبتوجيه الطلب إلى الكائن الثاني RealSubject، الذي ينفذ الطلب.
مخطط الفئات


سيناريوهات الاستخدام المحتملة
وكيل عن بعد
في مجال الاتصال الموزع بين الكائنات ، يُمثل الكائن المحلي كائنًا بعيدًا (ينتمي إلى نطاق عناوين مختلف). يعمل الكائن المحلي كوكيل للكائن البعيد، ويؤدي استدعاء دالة على الكائن المحلي إلى استدعاء دالة مماثلة على الكائن البعيد. مثال على ذلك، تطبيق جهاز الصراف الآلي ، حيث قد يحتوي الجهاز على كائنات وكيلة لمعلومات بنكية موجودة على الخادم البعيد.
وكيل افتراضي
بدلاً من استخدام كائن معقد أو ضخم، قد يكون تمثيل الهيكل العظمي مفيدًا في بعض الحالات. فعندما تكون الصورة الأساسية كبيرة الحجم، يمكن تمثيلها باستخدام كائن وسيط افتراضي، مع تحميل الكائن الحقيقي عند الحاجة.
وكيل الحماية
يمكن استخدام وكيل الحماية للتحكم في الوصول إلى مورد ما بناءً على حقوق الوصول.
مثال
فيما يلي مثال على نمط تصميم الوكيل في لغة C++ :
استيراد std ؛باستخدام std :: string ؛ باستخدام std :: unique_ptr ؛// فئة واجهة الموضوع Image { عام : افتراضي void display () const = 0 ; افتراضي ~ Image () = default ; };// فئة RealImage (مكلفة التحميل) class RealImage : public Image { private : string filename ; public : explicit RealImage ( const string & file ) : filename { file } { loadFromDisk (); }void display () const override { std :: println ( "عرض الصورة: {}" , filename ); }private : void loadFromDisk () const { std :: println ( "جارٍ تحميل الصورة من القرص: {}" , filename ); } };// فئة ProxyImage (تتحكم في الوصول إلى RealImage) ترث من فئة Image العامة { خاص : سلسلة نصية filename ؛ مؤشر فريد قابل للتغيير من RealImage إلى realImage ؛ // يتم إنشاؤه عند الحاجة عام : صريح ProxyImage ( سلسلة نصية ثابتة & file ) : filename { file } {}void display () const override { if ( ! realImage ) { std :: println ( "(Proxy) تحميل الصورة عند الطلب..." ); realImage = std :: make_unique < RealImage > ( filename ); } realImage -> display (); } };// كود العميل int main () { Image * img = new ProxyImage ( "photo.png" );// العرض الأول (يجب تحميله) img -> display ();// العرض الثاني (يجب استخدام الصورة المخزنة مؤقتًا) img -> display ();حذف الصورة ؛ إرجاع 0 ؛ }انظر أيضاً
مراجع
- ↑ إريك غاما، ريتشارد هيلم، رالف جونسون، جون فليسيدس (1994). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون ويسلي. ص 207 وما بعدها . ISBN 0-201-63361-2.
{{cite book}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ "نمط تصميم الوكيل - المشكلة والحل والتطبيق" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- ↑ "نمط تصميم الوكيل - البنية والتعاون" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
روابط خارجية
- جيري، ديفيد (22 فبراير 2002). "التحكم باستخدام نمط تصميم الوكيل" . جافا وورلد . تم الاسترجاع في 20 يوليو 2020 .
- مشروع PerfectJPattern مفتوح المصدر ، يوفر تطبيقًا مُجزأً لنمط الوكيل في لغة جافا.
- مقارنة أنماط المحول والوكيل والواجهة في Wayback Machine (تمت أرشفته في 2012-03-11)
- نمط تصميم الوكيل
- مثال على تطبيق نمط الوكيل بلغة C++ على موقع Wayback Machine (تمت أرشفته في 19-10-2014)
- وصف نمط الوكيل من مستودع أنماط بورتلاند
- أنماط تصميم البرمجيات
