احسان رضایی
احسان رضایی
خواندن ۳ دقیقه·۵ سال پیش

دیزاین پترن،‌ الگوی طراحی Strategy

http://www.developit.ir/design-patterns
http://www.developit.ir/design-patterns

مثال در دنیای واقعی

مرتب سازی 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 &quotSorting using bubble sort" // Do sorting return $dataset; } } class QuickSortStrategy implements SortStrategy { public function sort(array $dataset): array { echo &quotSorting 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

قابلیت استفاده.

زمانی که کلاس‌های مشابهی دارید که فقط در رفتارهایشان متفاوت هستند.

میتوان با استفاده از این الگو منطق تجاری یک کلاس را از جزئیات اجرای آن جدا کرد. به شرطی که این جزئیات برای آن منطق مهم نباشد.

و یا هنگامی که کلاس شما برای اجرای الگوریتم ها به شروط متفاوتی بستگی دارد.

مطالعه رایگان و خرید کتاب

دیزاین پترنالگوهای طراحیالگوی طراحیبرنامه نویسیبرنامه نویس
#ISTJ / Backend Developer / Gopher / PHP(Yii2, Laravel) / [ http://www.developit.ir ]
شاید از این پست‌ها خوشتان بیاید