حوزه: Object
هدف: Behavioral
نقش الگو
این الگو یک الگوی رفتاری یا Behavioral میباشد. الگوهای رفتاری با الگوریتمها و ارتباط بین آنها درگیر میباشند. اگر برنامه ما یک الگوریتم یکتا را پیاده سازی میکند گرچه ممکن است از چندین کلاس استفاده کند ولی به خاطر بالا رفتن پیچیدگی ممکن است که برای مدیریت برنامه و نگهداری کد مشکلاتی به جود بیاید. ما با استفاده از الگوهای طراحی رفتاری سعی میکنیم که از این پیچیدگی ها کم کنیم.
این الگو به این منظور استفاده می شود که یک الگوریتم را از کلاس میزبان جدا کرده و در کلاس دیگر نگهداری نماید. ممکن است که ما در برنامه خود چندین الگوریتم(استراتژی) داشته باشیم. حال اگر بخواهیم همه این الگوریتمها را در برنامه خود داشته باشیم در صورت عادی باید از عبارات شرطی بسیاری استفاده کنید و همین عمل باعث میشود که پیچیدگی برنامه به شدت بالا برود. الگوی strategy کاربر را قادر میسازد که از داخل یک گروه از الگوریتمها یک الگوریتم را برای استفاده انتخاب نماید.
شرح الگوریتم
اگر بخواهیم یک مثال ساده از الگوی Strategy بزنیم میتوانیم برنامهای را مثال بزنیم که با استفاده از روشهای متفاوت مرتب سازی یک سری اعداد را مرتب سازی میکند. الگوریتمهای متفاوتی برای مرتب سازی وجود دارد که میتوان به QuickSort و یا MergeSort اشاره کرد. هرکدام از این روشها میتوانند در شرایط خاصی بهترین انتخاب موجود باشند. میتوان تصمیم گیری این شرایط را با استفاده از الگوی Strategy پیاده سازی نمود. به این شکل که یک مجموعه از ورودیها را داریم. ولی هرکدام از روشهای مرتب سازی را به صورت جداگانه پیاده سازی میکنیم. ولی ورودیها و خروجیهای یکسانی داشته باشند. در این صورت با توجه به شرایط ورودیها را به یک الگوریتم داده و خروجی آن را دریافت خواهیم کرد.
طراحی الگوی Strategy در قالب نمودار UML در شکل زیر نشان داده شده است. همانگونه که در شکل دیده میشود میتوان از داخل استراتژیهای موجود در یک گروه، استراتژی مناسب انتخاب کرد.
- Context: کلاسی که اطلاعات ساختاری برای اشیا IStrategy را در خود نگه میدارد. همان قسمتی از برنامه است که نوع استراتژی را انتخاب میکند.
- IStrategy: یک اینترفیس مشترک بین همهی استراتژیها تعریف میکند.
- StartegyA ,StrategyB کلاسهایی که شامل الگوریتمهای پیاده شده از اینترفیس IStrategy میباشد.
پیاده سازی
public interface IStrategy {
public int doOperation(int num1, int num2);
}
public class OperationAdd implements IStrategy {
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubstract implements IStrategy {
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
public class App {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
}
}
استفاده از الگو
به طور کلی در زمانهای زیر از الگوی Strategy استفاده میکنیم.
- زمانی که کلاسهای مرتبط زیادی داشته باشیم و این کلاسها فقط در رفتارشان متفاوت باشند.
- زمانی که برای انجام کاری الگوریتمهای متفاوتی موجود باشد و بتوان شرایط انتخاب الگوریتم را توسط کدنویسی مشخص کرد.
- زمانی که الگوریتم از دادههایی استفاده میکند که استفاده کنندهها نباید به آن کد دسترسی داشته باشند.
زمانی پیش می آید که Context نمیخواهد از هیچکدام از استراتژیهای موجود استفاده کند در این صورت می گوییم که Context از استراتژی do nothing استفاده میکند. یعنی هیچ کاری انجام نمیدهد.
مثال پیاده سازی شده با زبان جاوا را میتوانید از github من دانلود کنید.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.