Showing posts with label Design Patterns. Show all posts
Showing posts with label Design Patterns. Show all posts

Strategy Design Pattern

Wednesday, August 13, 2008 | Labels: | 1 comments |

The Strategy Design Pattern
نبدأ أولاً مع التعريف وهو :

The Strategy Design Pattern basically consists of decoupling an algorithm from its host, and encapsulating the algorithm into a separate class. More simply put, an object and its behaviour are separated and put into two different classes. This allows you to switch the algorithm that you are using at any time.

وباختصار ، فإن هذا الباترن مكون من عملية decoupling للالجوريزم و encapsulating في كلاسات Classes مختلفة ، حيث يتم فصل الكائن عن سلوكه في كلاسين منفصلين ، وهو ما سيسمح لك لاحقاً بتغيير الالجوريزم وقت ما تريد .

مميزات هذا الباترن :
- يمكنك بكل بساطة من خلاله تغيير ال behaviour الخاص بك وقت ما تريد عن طريق فصل كل behaviour في كلاس خاص به .
- في حالة رغبتك في اضافة behaviour أو تعديله لن تضطر إلى التعديل في الكلاس الرئيسي .


الاستخدام :
عندما يكون لديك عدد من الكائنات Objects متشابه ومختلفة فقط في ال behaviour فإنه من المفضل دائماً استخدام Strategy حيث يمكنك اختصار جميع هذه الكلاسات في كلاس واحد فقط مع استخدام Strategies مختلفة .
كذلك الأمر أيضاً مع subclassing للكائنات ، حيث يعتمد الحل القديم على كون ال behaviour من نوع static ، وعندما ترغب في تغييره فإنك تقوم بعمل new instance ومن ثم تقوم بعمل تبديل replace للقديم ، ولكن الآن كل ما عليك هو تغيير ال Strategy وهو سيقوم تلقائياً بتعديل ال behaviour .


أيضاً فإن وجود عدد كبير من ال behaviour في كلاس واحد سيجبرك على كثرة استخدام الجمل الشرطية لمعرفة ال behaviour المطلوب ، أما مع Strategy فلن تحتاج إلى ذلك أبداً .
طريقة العمل بكل بساطة في الصورة التالية :

والله الموفق ..
والسلام عليكم ورحمة الله وبركاته .

Read more ...

Singleton Design Pattern

| Labels: , | 0 comments |

المشكلة :

أحياناً ما تحتاج لإن يكون ال Class الذي قمت بانشائه لا يمكن تعريف سوى نسخة أو Object واحد فقط منه ، وتحتاج إلى مثل هذه العملية في حالة كود هذا ال Class لا بد أن يكون موجوداً مرة واحدة في البرنامج وتظل قيمه مقروءة لجميع المستخدمين من أي مكان .


المشكلة ليست في جعل ال Class لا يتم سوى عمل نسخة واحدة منه ، بل إن هذا يتم بكل بساطة باستخدام الكلمة المحجوزة Sealed ، ولكن المشكلة تكمن في أنك عندما تريد أن تستخدم نسخة أخرى فإنك لن تستطيع ، وبذا لن يمكنك الاستفادة منه في كل مكان


في هذه الحالة نلجأ لما يسمى Singleton .


الشرح :


في البداية سوف ننشأ Class وليكن اسمه Singleton .
وفي كلا الأحوال لا بد للمنشىء constructor أن يكون private لكي لا يتمكن أحد من عمل نسخة جديدة منه .
وسنعرف نسخة من ال Class داخل ال Class نفسه بالشكل التالي :

private readonly Singleton instance;




ومن ثم سوف أقوم بعمل فنكشن استخدمها للحصول على هذه النسخة من أي مكان في البرنامج بالشكل التالي :








public Singleton getInstance

{


if (instance ==null) instance = new Singleton();


return instance


}






والآن هناك طريقتين لتطبيق هذه التقنية ، الطريقة السابقة التي ذكرناها وبامكانها العمل على أي لغة برمجة - بغض النظر عن أنني استخدم C# في الشرح - ، أما الطريقة الثانية فهي تتطلب لغة يمكنها قراءة static من أي مكان وهو ما يتوفر مثلاً في الجافا أو ال C# ولا يتوفر في ال C++ .

الطريقة الثانية تعتمد على الغاء الفنكشن getInstance والاعتماد على أن بامكان اللغة تعريف new من المتغير وقت التعريف ، ليصبح أمر التعريف بالشكل التالي :








public static readonly Singleton instance = new Singleton();






وفي هذه الحالة قم دائماً بقراءة instance دون الحاجة إلى التعريف لإنها static .

وهذه صورة توضح التقنيتن المشروحتين :









Read more ...