یکی از مسادل رایج در برنامه ها نسبت دادن حالات مختلف به اشیا (مانند Finite State Machines( و جابه جایی میان آنها هنگام اجرای برنامه است. این رفتار که عموما به صورت حلقه ها و جملات شرطی مانند switch-case یا if پیاده سازی میشوند، اغلب گسترش پذیر نیستند و یا با افزایش تعداد حالات پیجیده میشوند. در نتیجه می توان از الگوی State و Strategy برای پیادهسازی این رفتار استفاده کرد.
در مسئله فوق 2 حالت برای هر بسته پستی وجود دارد: Delivered و In-Transit. برای پیاده سازی این دوحالت ابتدا لازم است تا یک واسط مشترک به صورت زیر برای آنها تعریف کنیم:
سپس برای هر حالت یک کلاس تعریف کرده تا واسط فوق را پیاده سازی کنند:
میتوان در این مسئله نحوه ارسال را به عنوان استراتژی های مختلف در نظر گرفت. بدین منظور ابتدا یک واسط تعریف می کنیم:
سپس برای هر استراتژی و نحوه محاسبه قیمت یک کلاس تعریف و پیاده سازی میکنیم:
حال کلاس اصلی Mail را پیاده سازی میکنیم. همانظور که مشخص است هر شی از این کلاس دارای یک State و یک Strategy است که قابل تغییر میباشد:
در تصاویر زیر پیاده سازی منطق اصلی و یک نمونه از اجرای آن را مشاهده میکنید. همانطور که مشخص است به راحتی می توان حالت و استراتژی آبجکت فوق را تغییر داد:
1)الگوهای طراحی در کتاب "Design Patterns: Elements of Reusable Object-Oriented Software" از گروه چهارچوبهای عظیم (Gang of Four) به سه دسته اصلی تقسیم میشوند:
-
الگوهای ساختاری (Structural Patterns):
- Adapter Pattern (الگوی آداپتور): این الگو به کلاسها این امکان را میدهد که با تغییر واسط یک کلاس، با دیگر کلاسها سازگار شوند.
- Decorator Pattern (الگوی دکوراتور): این الگو به یک شیء این امکان را میدهد که بدون تغییر کد، ویژگیهای جدید به شیء افزوده شوند.
-
الگوهای رفتاری (Behavioral Patterns):
- Observer Pattern (الگوی مشاهدهگر): این الگو ارتباط یک به چند بین اشیاء را مدلسازی میکند به نحوی که یک تغییر در یک شیء، سایر شیءها را بهروز رسانی کند.
- Strategy Pattern (الگوی استراتژی): این الگو به یک خانواده از الگوهای الگویی اجازه میدهد تا از یکدیگر قابل تعویض باشند بدون اینکه کلاینت اطلاعات خود را از آنها از دست دهد.
-
الگوهای خدمات (Creational Patterns):
- Singleton Pattern (الگوی تکنمونه): این الگو اطمینان حاصل میکند که یک کلاس تنها یک نمونه از خود داشته باشد و به دیگر کلاسها اجازه ایجاد نمونه از آن را ندهد.
- Factory Method Pattern (الگوی متد کارخانه): این الگو به یک کلاس اجازه میدهد تا ایجاد شیء را به زیرکلاسهای خود منتقل کند ولی مشخص میکند که کدام کلاس باید ایجاد شود.
3)** در این سناریو، الگوی طراحی Singleton مناسب به نظر میآید. الگوی Singleton اطمینان حاصل میکند که یک کلاس فقط یک نمونه از خود ایجاد میکند و این نمونه به تمامی قسمتهای برنامه قابل دسترسی است.
2)** در پیادهسازی این آزمایش، الگوهای طراحی Strategy و State به طور واضح استفاده شدهاند
- اصل مسئولیت تک:
- تحقق: الگوی Singleton مسئولیت ایجاد و مدیریت یک نمونه یکتای یک کلاس را بر عهده دارد و از ایجاد نمونههای بیشتر جلوگیری میکند.
اصل بازبینی مهم:
- تحقق: الگوی Singleton اجازه باز کردن ویرایش و بهبودها در کد را برای تنها یک نقطه مرکزی (کلاس Singleton) فراهم میکند و این اصل را تقویت میکند.
اصل جداشدگی رابط:
- تحقق: کلاسهای دیگر که از کلاس Singleton استفاده میکنند، با توجه به رابط آن با آن ارتباط برقرار میکنند و از پیچیدگی و جزئیات پنهان شده درون کلاس Singleton مستقل هستند.