Thursday, December 13, 2012

Command Pattern

التعريف :

في بعض الأحيان توجد الكثير من التطبيقات التي تنفذ العديد من العمليات على بيانات معينة,مثلا معالجة صورة معينة باستخدام عمليات ومنها (التدوير ,القطع , التلوين ,أضافة فعالية معينة), هذه العمليات تسمى Method , يأتي الأن السؤال كيف يتم تنظيم كل هذه الأوامر والعمليات ضمن تطبيق معين سواء تطبيق للمعالجة النصية او الرسومية.يتم هذا من خلال أستخدام Command Pattern وهو من الأنماط المتميزة لأجل تفاعلات واجهة المستخدم الرسومية (GUI),فهو يسمح وبسهولة بتغليف logic لأجل تنفيذ العمليات , ويستخدم بكثرة في البرامج التي تحوي الكثير من الأوامر والأزرار والبرامج التي تستخدم خاصية Undo/Redo.يعمل هذا النمط على تحويل جميع الطلبات Request الى كائنات Objects ويعطيها الى public interface .النمط يضمن ان كل كائن يتلقى الأوامر Command الخاصة به,ويقلل الأقتران بين المنادي Invoker الذي ينادي العملية والمستلم Reviser  هو الكائن الذي يتلقى الطلبية request وينفذها.لنأتي الى تعريف Gang of Four .

Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log 
requests, and support undoable operations.

يقوم النمط بتغليف جميع الطلبيات request  الأتية من المنادي invoker من خلال تحويلها الى كائنات وتمريرها الى المستلم receiver لأجل تنفيذها action , مما يزود سهولة بتعيين الأوامر الخاصة لكل كائن . 

التنفيذ:

يتم أولا شرح هيكلية النمط Command من خلال لغة UML وذلك من خلال Class Diagram التالي :

نشاهد من الرسم التالي ثلاث كائنات رئيسية :

Client : وهو مسؤول على خلق Concrete Command الذي يرث من الكلاس Command بمعنى عندما يتم الضغط على زر معين يتم مباشرة خلق Command محدد خاص به يسمى concrete command ويحمل الى receiver لأجل تنفيذه.

Invoker : يحدد متى يتم تنفيذ الأمر Command بمعنى المستخدم يضغط على الزر لأجل حمل الطلب الذي يحوي على Concrete Command الذي تم خلقه من قبل Client  الى receiver لأجل تنفيذه.

Receiver : وهو يحوي على كل المعلومات المنطقية لتنفيذ العملية Action  للأمر المحدد Concrete Command لأجل تنفيذه .

الكود:

الأن سوف نقوم بكتابة الكود علما ان الكود مكتوب بلغة #C وبأستخدام بيئة Visual Studio 2010 ,وأن الكود مكتوب لأجل تعريف هيكلية النمط Command وسوف يتألف من المكونات التالية :

خلق هيكلية نمط Command:

1. يتم خلق كلاس receiver لأجل حمل الطلب ومن ثم تنفيذ الفعالية المطلوبة action لأجل الطلب request.ونلاحظ احتوائه على جميع العمليات المنطقية.

2. ومن ثم يتم خلق كلاس command من نوع abstract وخلق كلاس concrete command يرث من كلاس command بحيث يقوم الأبن بتمرير كائن receiver الى الأب لأجل ضمان أن كل كائن يحوي الأوامر الخاصة به .ويحوي الكلاس Command على عملية Execute التي يتم توريثها الى كل Concrete command يتم خلقه لأجل تنفيذ العمليات المنطقية في receiver 

 3. الأن يتم خلق كلاس invoker لأجل تنفيذ ال command بحيث يتم تمرير الكائن Command عبر عملية موجودة بداخله لأجل خزن حالة Concrete Command وتوجد عملية أخرى لأجل التنفيذ خاصة ب Concrete Command  المحدد بحيث نضمن ان كل كائن ينفذ الأوامر الخاصة به ويحوي على receiver خاص به لأجل تنفيذ Action الخاصة بال Concrete Command .

 تنفيذ النمط Command:


نأتي الأن لشرح الخطوات :

A - يتم خلق متلقي لأجل الطلبات الذي سوف يقوم بحمل الطلب لتنفيذه
B - يتم خلق كائن Command وتمرير المتلقي receiver وهنا أستخدمت منهجية الكائنية المنحنى والتي تدعى polymorphic .
C - يتم تمرير receiver الى الأب Command لأجل خزن حالة المتلقي الخاصة ب Concrete Command
D - يتم خلق منادي invoker لأجل بدأ تنفيذ ال Command 
E - يتم تنفيذ عملية SetCommand والتي من خلالها يمرر الكائن Command لأجل خزن حالة Concrete Command وضمان ان كل كائن يحوي على المعلومات الخاصة به.
F - وبعدها يتم أستدعاء ExecuteCommand من خلال أستخدام الكائن invoker
G - يتم استدعاء العملية Execute الخاصة بال Concrete Command الذي خلق في البداية.
H - وأخيرا يتم تنفيذ المتلقي الذي يحمل الطلب والذي يقوم بتنفيذ فعالية الطلب  Action.

المخرجات :

أذن بعد تنفيذ الكود سوف يتم طباعة التالي : 


النتيجة :

يتم عكس نظرة برمجة كائنية المنحنى OOP من خلال استخدام Polymorphic و Inheritances .
.  يقوم بتغليف جميع الطلبات request في كائنات.
.  يستخدم بكثرة في التطبيقات التي تحوي Menu action مثل (Open,File,Save,Copy Edit).
.  جميع ال Concretes Commands ترث من كلاس رئيسي مجرد وهو Command ولهذا السبب يتم أستخدام هذا النمط في عمليات ال Undo/Redo وهي خزن الحالات السابقة والحالات الاحقة مثال: Microsoft Office يحوي الخاصية.

1 comment: