الگوی طراحی استراتژی
کتابخانه الکترونیکی دیتا ساینس
الگوی طراحی استراتژی (Strategy pattern)، الگویی است که یک هدف دارد و برای رسیدن به آن هدف، روشهای مختلف و استراتژیهای مختلفی پیاده سازی میشود. به عبارتی این نوع طراحی، یک طراحی رفتاری است که از یک interface استفاده میکند و کلاسها جزئیات را براساس این interface یا واسط پیادهسازی میکنند.
فرض کنید ما یک کارخانه تولید ماشین به مانند ایران خودرو یا سایپا داریم که در موعد مقرر میخواهیم، ماشینهای ثبت نام شده را به مشتریان تحویل بدهیم. راههای متفاوتی برای تحویل خودرو وجود دارد. ابتدا بهتر است یک واسط یا Interface برای دلیوری پیاده سازی نماییم.
interface DeliveryStrategy { public function deliver(Address $address):DeliveryTime; }
در اینجا، نام رابط یا واسط ما DeliveryStrategy است. در این interface، متدی به نام deliver داریم. یک شی از نوع آدرس میگیرد و خروجی را برمیگرداند. بنابراین، هر استراتژی به یک روش تحویل و یک شی آدرس نیاز دارد.
به عنوان مثال، ما قرار است ماشین را با کشتی تحویل دهیم. در این کلاس که از interface به نام DeliveryStrategy استفاده میکنیم و جزئیات متد deliver را پیادهسازی میکنیم. در این متد هزینه ها و زمان تحویل محاسبه میشود.
class ShipDelivery implements DeliveryStrategy { public function deliver(Address $addrress): { $route= new ShipRoute($address); echo $route->calculateCosts(); echo $route->calculateDeliveryTime(); } }
حال میتوانیم یک کلاس CarDelivery ایجاد کنیم که یکی از استراتژیهای تحویل را فراخوانی میکند.
class CarDelivery { public function deliverCar(DeliveryStrategy $strategy, Address $address) { return $strategy->deliver($address); } } $address= new Address('example address 12345'); $delivery= new CarDelivery(); $delivery=>deliver(new ShipDelivery(), $address);
از آنجایی که DeliveryStrategy یک رابط است، آن را به کلاس CarDelivery می دهیم تا استراتژی های جدید هم بعدا به آن اضافه شود. ما ShipDelivery داریم و اکنون میتوانیم استراتژی تحویل دیگری به مانند TruckDelivery ایجاد کنیم تا بتوانیم ماشین را با کامیون تحویل دهیم که میتواند محاسبات متفاوتی داشته باشد اما از یک رابط استفاده کند و همان کاری را انجام دهد که تحویل است.
منبع: https://codesource.io/brief-overview-of-design-pattern-used-in-laravel/