آموزش الگوی طراحی Strategy Design Pattern قسمت سوم

آموزش الگوی طراحی Strategy Design Pattern قسمت سوم

آموزش الگوی طراحی Strategy Design Pattern قسمت سوم 1350 500 حسین صداقت

قسمت دوم این مقاله را در اینجا بخوانید.

 

نکته پایه طراحی ۲: با یک اینترفیس برنامه نویسی کنید نه با پیاده سازی یک کلاس

ما برای نشان دادن هر رفتار از اینترفیس های FlyBehavior و  QuackBehavior استفاده می کنیم و برای پیاده سازی ها این دو اینترفیس را اجرا می کنیم.

در این روش لازم نیست که اینترفیس های بالا را کلاس Duck پیاده سازی کنند و به جای آن ما مجموعه کلاس هایی داریم که این رفتار ها را پیاده سازی می کنند.

 

 

در این طراحی کلاس Duck از رفتار های پیاده سازی شده توسط اینترفیس ها استفاده می کنند. بنابراین رفتار واقعی در کلاس Duck قفل نمی شوند.

سوال : چرا در برنامه نویسی از Interface استفاده می کنیم؟

استفاده از اینترفیس در حقیقت به Polymorphism اشاره دارد و سبب می شود که شیئی که در Run time در حال اجراست در کد قفل نشود و شی قابل تغییر باشد. زمانی که از یک کلاس از اینترفیس استفاده می کند در حقیقت Type واقعی را متوجه نخواهد شد.

پیاده سازی رفتار های Duck

در اینجا دو اینترفیس FlyBehavior و QuackBehavior داریم که کلاس های شامل پیاده سازی رفتار ها یکی از این دو اینترفیس را پیاده سازی می کنند.

 

 

در این طراحی قابلیت استفاده مجدد در رفتار ها هم وجود دارد زیرا این رفتار ها در کلاس های مختلف Duck مخفی نیست و ما بدون تغییر در هیچ یک از کلاس های Behavior و یا Duck می توانیم یک کلاس Behavior جدید اضافه کنیم.

یکپارچه سازی Duck و Behavior و نحوه استفاده از Bahavior توسط Duck

۱-در مرحله اول ما دو متغیر با Type های FlyBehavior و QuackBehavior ایجاد می کنیم .هر شی Duck به این دو متغیر را با استفاده از Beahvior ها می تواند مقدار دهی کند.

 

۲- متد PerformQuack را برای کلاس Duck به صورت زیر پیاده سازی می کنیم.

 

۳- و در مرحله آخر می بینیم که به چه صورت مقدار های Behavior را ست می کنیم:

 

در این مرحله در کلاس MallardDuck در Constructor مقادیر Bahavior ست می شود.

خب در این مرحله در Constructor از Implemention استفاده کرده ایم و حرف قبلی خودمان که گفته بودیم در برنامه نویسی از Interface به جای  پیاده سازی استفاده کنیم را نقض کرده ایم و این سبب می شود که کد منعطف نباشد و Object در کد قفل شود. فعلا در اینجا تست کد فعلی را می گیریم و در آخر به سراغ این مشکل باز خواهیم گشت.

 

تست کد

۱-ابتدا کلاس Duck را ایجاد می کنیم:

 

۲-اینترفیس FlyBehavior  را ایجاد کرده و دو پیاده سازی برای آن تعریف می کنیم.

 

۳-اینترفیس Quack Behvior را ایجاد می کنیم و سپس دو پیاده سازی برای آن تعریف  می کنیم.

 

۴-و در نهایت کد را ب صورت زیر اجرا می کنیم:

 

۵-خروجی

 

 

حل مشکل استفاده از Implementation به جای Interface

همانطور که در ۲مرحله قبل اشاره کردیم ما در تعریف کلاس MarralDuck از اینترفیس اضافه نکردیم که باید این مشکل را حل کنیم:

۱-ابتدا دو متد به کلاس Duck اضافه می کنیم:

 

۲-یک Type از کلاس Type ایجاد می کنیم:

 

۳-یک FlyBehavior دیگر ایجاد می کنیم:

 

۴-و در نهایت کد را به صورت زیر اجرا می کنیم:

 

۵-خروجی به صورت زیر در می آید:

دیاگرام کلاس ها به صورت کامل

 

زمانیکه ما دو کلاس را داخل یکدیگر می گذاریم از Composition استفاده کرده ایم. به جای ارث بری رفتار ها، اردک های رفتارهای مورد نیازشان را با استفاده از Composition می گیرند. این یک تکنیک مهم است.

نکته پایه طراحی ۳: استفاده از Compostion نسبت به ارث بری در اولویت است. زیرا همانطور که دیدیم استفاده از Composition سبب انعطاف پذیری می شود و ما در اینجا توانستیم در Run time رفتارها را تغییر دهیم.

Composition در بسیاری از Design Pattern ها استفاده شده است.

این فرآیندی که ما طی کردیم مربوط به الگوی طراحی Strategy بود و در حقیقت ما Strategy Design Pattern را با هم فرا گرفتیم.

 

نکاتی در مورد  برنامه نویسی و برنامه نویسی شی گرا

۱-برنامه نویسی شی گرا در حقیقت راه استفاده مجدد از کدهاست و باعث می شود که زمان برنامه نویسی کاهش پیدا کند.

۲-در برنامه نویسی زمان تعمیر و نگهداری و تغییر کد بیشتر از زمان Development اولیه می باشد و در حقیقت تلاش ما برای طراحی کد به صورتی که بتوان از آن استفاده مجدد کرد برای این است که در تعمیر و نگهداری و تغییرات بتوانیم زمان را کاهش دهیم.

قسمت چهارم این مقاله را در اینجا بخوانید.

منبع : Head First Design Pattern

 

یکشنبه‌ها قبل از شروع کار یک مقاله رایگان از لابراتوار رسانه برای بهبود کسب و کار خود دریافت کنید

 

 

Subscribe for free resources and news updates.