في هذه الصفحة
الـ Observer Design Pattern واحد من أهم الـ Behavioral Design Patterns اللي بتسمحلك انك تحدد زي طريقة Subscription تسمحلك انك تـ Notify بعض الـ Objects بأي نوع من الـ Events اللي ممكن يكونوا مهتمين بيها.
وده بيحصل من خلال مراقبة التغييرات اللي ممكن تحصل للـ Object اللي بيراقبوه وأول ما يكون فيه Event يهمهم بيبدأ يجيلهم Notification بالتغيرات دي.
قبل ما نكمل كلامنا عنه بالتفصيل خلونا نشوف مع بعض الـ Use Case دي:
تعالوا نتخيل ان مطلوب مننا اننا نبني Notification System خاص بـ Online Marketplace بمعنى اصح متجر الكتروني , عشان لو فيه اي منتجات جديدة ضفناها في الـ System عندنا او عروض جديدة نبدا نبعت Notification او رسايل للـ Users اللي عاملين Subscribe معانا في الـ System بحيث يكونوا اول ناس يعرفوا الـ Updates اللي بتحصل.
Naive UML Class Diagram
مصدر الصورة : Ultimate Design Pattern Course in Udemy
اول حل جه في بالي هو اني عملت OnlineMarketPlace وخليت يبقى عندي User , Product , Offer والعلاقة بينهم Composition لان الـ Online Market Place is Composed of Users , Products , Offers
وعملت الـ Functionality بتاعة اني ازود User وابعتلهم Notifications وشوفنا مع بعض ده من خلال الـ Boolean Flags عشان اعرف افلتر مين ابعتله ومين مبعتلوش ..
بس هل يا ترى الحل ده كان افضل حل ؟ في الحقيقة لا
- اول مشكلة في الحل ده هي الـ Complexity: وده لان زي ما شوفنا عنودي اكتر من Subscription ومحتاج اهندل كل ده واعدي على الـ Users كلهم واشوف مين بيحقق الشرط ومين لا.
- تاني مشكلة في الحل ده هي الـ Tightly Coupling: وده شوفناه من خلال ان الـ OnlineMarketPlace باه بيعتمد بشكل كلي على الـ Conditions اللي موجودة في الـ User فلو حصل اي تغير هناك هضطر اغير في الـ MarketPlace وده مش Maintainable.
- اما بالنسبة لتالت مشكلة فهي الـ Extensibility: فتخيلوا معايا اني لو حبيت اضيف نوع جديد من الـ Subscription وليكن عاوز ابعت Notification لما يكون عندي وظايف شاغرة ومحتاج عمال وموظفين.
هعمل ده ازاي ؟ هضطر اروح اعمل Field جديد واغير في كل مكان واقول isSubscribedToJobOpennings وبالتالي ده هيـ Violate Open Close Principle ..
فتعالوا نشوف مع بعض هنحل المشاكل دي ازاي !
Enhanced UML Class Diagram
مصدر الصورة : Ultimate Design Pattern Course in Udemy
اول حاجة عملتها هنا هي اني فصلت الاعتمادية بين الـ OnlineMarketplace والـ Users من خلال الـ Interface اللي سميته Subscriber وبالتالي هنا ممكن في الـ Online Market Place اضيف New Subscribers وغيرت الـ User لـ Customer وبالشكل ده , شلت كل الحاجات اللي ملهاش لازمة حاليا ..
الـ Product / Offer زي ماهم مغيرناش فيهم حاجة .. خليت عندي هنا حاجة جميلة وهي الـ EventType وده لاني مش بس ممكن الـ Subscribers يعملوا Subscribe على New Product / Offer ممكن يبقى عندي Events تانية من نوع مختلف وجديد ..
وغيرت هنا بدل الـ List User باه عندي Dictionary شايل جواه كل EventType والـ Subscribers بتوعه ..
طب انا كده استفدت ايه ؟