مرتب سازی data را در نظر بگیرید. ابتدا از مرتب سازی bubble sort استفاده میکنیم اما با افزایش آیتم ها این الگوریتم خیلی کند میشود. quick sort را جایگرین آن میکنیم. هر چند عملکرد بهتری با مجموعه دادههای بزرگ دارد، اما برای مجموعه دادههای کوچکتر بسیار کند است. به این منظور یک استراتژی برای پیادهسازی در نظر میگیریم. روی مجموعه دادههای کوچک bubble sort انجام شود و برای بزرگتر ها quick sort.
الگوی strategy این امکان را میدهد تا الگوریتم ها بر اساس موقعیت و شرایط متفاوت تغییر کنند.
در این الگو خانوادهای از الگوریتم ها را تعریف میکنیم و هر یک را در کلاس جداگانه و مستقل قرار میدهیم تا قابل انتخاب یا تعویض باشند.
الگوی strategy قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن میسازد. این الگو:
- یک خانواده از الگوریتمها را معرفی میکند
- هر الگوریتم را کپسوله میکند
- و باعث میشود الگوریتمهای آن خانواده بهطور قابل تعویض قابل استفاده باشند.
الگوی strategy یکی از الگوهای موجود در کتاب مشهور الگوهای طراحی است که توسط گاما و دیگران نوشته شدهاست و مفهوم استفاده از الگوهای طراحی برای توصیف نحوه طراحی انعطافپذیر و قابل استفاده مجدد شئ گرا در نرمافزار را محبوب ساخت.
مثال همین قسمت را انجام میدهیم. ابتدا ما یک interface از strategy و strategy های متفاوت جستجو را پیادهسازی میکنیم.
interface SortStrategy { public function sort(array $dataset): array; } class BubbleSortStrategy implements SortStrategy { public function sort(array $dataset): array { echo "Sorting using bubble sort" // Do sorting return $dataset; } } class QuickSortStrategy implements SortStrategy { public function sort(array $dataset): array { echo "Sorting using quick sort" // Do sorting return $dataset; } }
سپس کلاس مرتب سازی که میتواند از strategy های جستجو استفاده کند.
class Sorter { protected $sorter; public function __construct(SortStrategy $sorter) { $this->sorter = $sorter; } public function sort(array $dataset): array { return $this->sorter->sort($dataset); } }
و استفاده
$dataset = [1, 5, 4, 3, 2, 8]; $sorter = new Sorter(new BubbleSortStrategy()); $sorter->sort($dataset); // Output : Sorting using bubble sort $sorter = new Sorter(new QuickSortStrategy()); $sorter->sort($dataset); // Output : Sorting using quick sort
زمانی که کلاسهای مشابهی دارید که فقط در رفتارهایشان متفاوت هستند.
میتوان با استفاده از این الگو منطق تجاری یک کلاس را از جزئیات اجرای آن جدا کرد. به شرطی که این جزئیات برای آن منطق مهم نباشد.
و یا هنگامی که کلاس شما برای اجرای الگوریتم ها به شروط متفاوتی بستگی دارد.