این الگوی طراحی این امکان را میدهد که یک عملیات را با الگوریتمهای مختلف پیادهسازی کرده و آن را بتوانیم با این الگوریتمها اجرا کنیم (یعنی میتوانیم هر وقت که خواستیم الگوریتم را عوض کرده و با الگوریتم دیگری عملیات را اجرا کنیم).
نمودار کلاس این الگوی طراحی (یک interface مشترک وجود دارد که هر الگوریتم، به عنوان یک کلاس آن را پیادهسازی میکند):
مثال (مرتبسازی آرایه با الگوریتمهای مختلف):
interface SortStrategy
{
void sort(Double[] array, boolean reverse);
}
class BubbleSort implements SortStrategy
{
@Override
public void sort(Double[] array, boolean reverse)
{
// TODO bubble-sort implementation
}
}
class InsertionSort implements SortStrategy
{
@Override
public void sort(Double[] array, boolean reverse)
{
// TODO insertion-sort implementation
}
}
class QuickSort implements SortStrategy
{
@Override
public void sort(Double[] array, boolean reverse)
{
// TODO quick-sort implementation
}
}
نمونهی استفاده :
public class Test
{
public static void main(String[] args)
{
Double[] array1 = new Double[10];
Double[] array2 = new Double[10];
// fill arrays
SortStrategy sortStrategy = new BubbleSort();
sortStrategy.sort(array1,false);//sorts array1 with bubble sort algorithm
sortStrategy = new QuickSort();
sortStrategy.sort(array2,false);//sorts array2 with quick sort algorithm
}
}
مثال عملیتر:
فرض کنید یه سرویس میخواهیم که فایلهای متنی رو encrypt کنه. دو تا استراتژی مختلف درنظر میگیریم:
-
برای فایلهای کوچک، از روشی استفاده میکنیم که تمام کارها رو در memory انجام میده
-
برای فایلهای بزرگ، از روشی استفاده میکنیم که (مثلا) از hard هم استفاده میکنه