IranIT.info Articles
عنوان الگوهاي طراحي، قسمت سوم : ادامه فصل اول، بخش 2-1
نويسندهحسن ابوالحسنى تاريخ ارسال 16/06/1381 نام قسمت فناورى
1.2 الگوهاي طراحي در مدل-ويو-کنترلر (Controller-View-Model) زبان Smalltalk
زنجيره مدل/ويو/کنترلر(MVC) از کلاسها در smalltalk براي ساخت رابطهاي کاربر (user interfaces) بکار برده مي شود. نگاه کردن به الگوهاي طراحي در داخل MVC کمک مي کند تا ببينيد منظورمان از مفهوم الگو چيست.

MVC در بر گيرنده سه نوع از اشياء است. مدل، شيء کاربرد (application object) است. ويو نمايش آن بوده و کنترلر روشي که رابط استفاده کننده روي وروديهاي کاربر عمل مي کند را تعريف مي نمايد. قبل از MVC، طرح هاي رابط کاربر تمايل به آميختن اين اشياء در يکديگر را داشتند. MVC آنها را از هم جدا ساخته تا قابليت انعطاف و قابليت استفاده مجدد را افزايش دهد.

MVC ويوها و مدل ها را با برقرار ساختن يک پروتکل اشتراک/اطلاع (subscribe/notify) بين آنها از يکديگر جدا مي سازد. يک ويو بايستي اطمينان ايجاد کند که نمايش آن منعکس کننده حالت مدل باشد. هرگاه داده هاي مدل تغيير کند، مدل ويوهايي که به آن وابسته اند را آگاه مي سازد. در پاسخ، هر ويو يک فرصت براي تصحيح خود پيدا مي کند. اين مشي اجازه مي دهد تا چندين ويو را به يک مدل براي تدارک نمايش هاي متفاوت متصل سازيد. همچنين مي توانيد ويوهايي جديدي براي يک مدل بدون نياز به بازنويسي آن بسازيد.

دياگرام زير يک مدل و سه ويو را نشان مي دهد. (براي ساده سازي کنترلرها را نشان نداده ايم.) مدل شامل تعدادي مقادير بوده، و ويوها يک صفحه گسترده ، هيستوگرام و پي چارت روشهاي متفاوت نمايش اين داده هاست. مدل با ويوهايش هنگاميکه مقاديرش تغيير کند ارتباط برقرار ساخته و ويوها براي دسترسي به اين داده ها با مدل ارتباط برقرار مي کنند.




اين طراحي بطور مشخص مثالي از طراحي است که ويوها را از مدل ها جدا مي کند. ولي اين طراحي بر روي يک مسأله عمومي تر قابل اعمال است: جدا کردن اشياء بطوريکه تغييرات در يکي بتواند هر تعدادي از ديگران را تحت تاثير قرار داده بدون نياز به اينکه شيء تغيير کرده جزئيات ديگران را بدانند. اين طراحي عمومي تر بوسيله الگوي طراحي مشاهده کننده (observer) (صفحه 293) تشريح شده است.

ويژگي ديگر MVC اين است که ويوها مي توانند تودرتو باشند. براي مثال يک پانل کنترلي از دکمه ها مي تواند بصورت يک ويو پيچيده شامل ويوهايي از دکمه هاي تودر تو، پياده سازي شود. يا رابط استفاده کننده براي يک تناظر بر اشياء مي تواند شامل ويوهاي تودرتويي بوده که مي تواند در يک ديباگر (debuger) مورد استفاده مجدد قرار گيرد. MVC ويوهاي تودرتو را با کلاس CompositeView تدارک مي بيند که زير کلاسي از کلاس View است. اشياء از نوع CompositeView درست مانند اشياء از نوع View عمل مي کنند. يک ويو ترکيبي مي تواند هر جايي که يک ويو ساده عمل مي کند مورد استفاده قرار گيرد، ولي در عين حال شامل ويوهاي تودرتو است که آنها را نيز مديريت مي نمايد.

در اينجا هم، مي توانيم اين را تنها يک طرحي که به ما اجازه مي دهد يک ويو ترکيبي را درست عين اجزائش مورد عمل قرار دهيم، در نظر بگيريم. ولي اين طرح بر يک مسأله عمومي تر قابل اعمال است، که هنگاميکه مي خواهيم اشياء را گروه بندي کرده و به گروه درست مثل اشياء منفرد برخورد کنيم مفيد است. اين طرح عمومي تر به وسيله الگوي طراحي Composite (صفحه 163) تشريح شده است. اين الگو اجازه مي دهد تا يک سلسله مراتب از کلاسها که در برخي از زير کلاسها اشياء اوليه (مثل Button) و کلاسهاي ديگر اشياء ترکيبي ( مثل CompositeView) که اشياء اوليه را در اشياء پيچيده تر مونتاژ مي کنند را تعريف مي کند.

MVC اجازه مي دهد تا روشي که يک ويو به ورودي استفاده کننده جواب مي دهد بدون نياز به تغيير نمايش ويژوال را تغيير داد. مثلا ممکن است بخواهيد روشي که به يک ورودي از صفحه کليد پاسخ داده شده را تغيير داده و يا از يک menu up-pop بجاي command keys استفاده کنيد. MVC مکانيزم پاسخگويي را در يک شئي کنترلر کپسول سازي مي نمايد. يک سلسله مراتب از کلاسهاي کنترلر وجود دارد که باعث مي شود براحتي يک کنترلر جديد را بسازيد.

يک ويو يک نمونه از يک زير کلاس کنترلر را براي پياده سازي يک استراتژي پاسخ دهي بکار مي برد، براي پياده سازي يک استراتژي متفاوت، تنها کافيست آن نمونه را با يک کنترلر ديگر جايگزين کرد. حتي اين امکان وجود دارد تا کنترلر يک ويو را در زمان اجرا تغيير داد تا ويو نحوه پاسخگويي اش به وروديهاي استفاده کننده را تغيير دهد. براي نمونه، يک ويو مي تواند غير فعال شود بطوريکه هيچ ورودي را نپذيرد به اين صورت که به آن کنترلي که وروديها را چشم پوشي کند بدهيم.

ارتباط ويو-کنترلر مثالي از الگوي طراحي استراتژي (صفحه 315) است. يک استراتژي شيء است که يک الگوريتم را نمايش مي دهد. چنين الگويي براي هنگاميکه مي خواهيد الگوريتمي را بصورت ايستا يا پويا تغيير داده، هنگاميکه انواع زيادي از يک الگوريتم داريد ويا وقتيکه الگوريتم براي ساختمان داده پيچيده اي درست شده که مي خواهيد آنرا کپسول سازي کنيد، مفيد است.

MVC الگوهاي طراحي ديگري را نيز مورد استفاده قرار مي دهد، نظير Factory Method (صفحه 107) براي تعيين يک کنترلر پيش فرض مورد استفاده يک ويو، و يا Decorator (صفحه 175) براي افزودن خاصيتي به يک ويو. ولي روابط اصلي بوسيله الگوهاي طراحي observer، composite و strategy بيان مي شوند.

الگوهاي طراحي، قسمت دوم : شروع فصل اول الگوهاي طراحي، قسمت چهارم : ادامه فصل اول، بخش 3-1