استـــراتـــژی(Startegy)
هـــدف
مـسئـــلـه
یک روز تصمیم گرفتید یک برنامه ناوبری برای مسافران معمولی ایجاد کنید. این برنامه حول یک نقشه زیبا متمرکز بود که به کاربران کمک میکرد تا خود را به سرعت در هر شهری جهتیابی کنند.
یکی از ویژگیهای پرطرفدار برای این برنامه برنامهریزی خودکار مسیر بود. یک کاربر باید بتواند یک آدرس وارد کند و ببیند سریعترین مسیر به آن مقصد روی نقشه نمایش داده میشود.
نسخه اول این برنامه فقط میتوانست مسیرها را روی جادهها بسازد. افرادی که با ماشین سفر میکردند از خوشحالی سرشار بودند. اما ظاهراً همه دوست ندارند در تعطیلات خود رانندگی کنند. بنابراین با بهروزرسانی بعدی، گزینه ساخت مسیرهای پیادهروی را اضافه کردید. بلافاصله بعد از آن، گزینه دیگری برای اجازه دادن به مردم برای استفاده از حمل و نقل عمومی در مسیرهای خود اضافه کردید.
با این حال، این تنها آغاز بود. بعداً قصد داشتید مسیرسازی برای دوچرخهسواران اضافه کنید. و حتی بعداً، گزینه دیگری برای ساخت مسیرها از طریق تمام جاذبههای گردشگری یک شهر.
کد ناوبری متورم شد.
در حالی که از نظر تجاری، این برنامه موفق بود، بخش فنی آن برای شما سردردهای زیادی ایجاد کرد. هر بار که یک الگوریتم مسیریابی جدید اضافه میکردید، کلاس اصلی ناوبری دو برابر میشد. در برخی موارد، این هیولا برای نگهداری بسیار دشوار شد.
هر تغییری در یکی از الگوریتمها، چه یک رفع ساده اشکال باشد یا یک تنظیم جزئی از امتیاز خیابان، کل کلاس را تحت تأثیر قرار میداد و احتمال ایجاد خطا در کدهای قبلاً کارآمد را افزایش میداد.
علاوه بر این، کار گروهی ناکارآمد شد. همتیمیهای شما که درست پس از انتشار موفقیتآمیز استخدام شده بودند، شکایت داشتند که وقت زیادی را برای حل تعارضات ادغام صرف میکنند. پیادهسازی یک ویژگی جدید نیاز به تغییر همان کلاس عظیم دارد و با کدی که توسط افراد دیگر تولید شده است، در تضاد است.
راهــکــــار
الگوی استراتژی پیشنهاد میکند که یک کلاس را که کاری خاص را به روشهای مختلف انجام میدهد، بردارید و تمام این الگوریتمها را به کلاسهای جداگانهای به نام استراتژیها استخراج کنید.
کلاس اصلی، که زمینه نامیده میشود، باید یک فیلد برای ذخیره مرجعی به یکی از استراتژیها داشته باشد. زمینه کار را به یک شیء استراتژی مرتبط واگذار میکند تا اینکه آن را به تنهایی اجرا کند.
زمینه مسئول انتخاب الگوریتم مناسب برای کار نیست. در عوض، مشتری استراتژی مورد نظر را به زمینه منتقل میکند. در واقع، زمینه اطلاعات زیادی در مورد استراتژیها ندارد. زمینه با تمام استراتژیها از طریق یک رابط عمومی یکسان کار میکند که فقط یک متد برای فعال کردن الگوریتم کپسوله شده در استراتژی انتخاب شده را نشان میدهد.
به این ترتیب، زمینه مستقل از استراتژیهای مشخص میشود، بنابراین میتوانید الگوریتمهای جدید را اضافه کنید یا موجود را بدون تغییر کد زمینه یا استراتژیهای دیگر اصلاح کنید.
استراتژیهای برنامهریزی مسیر
در برنامه ناوبری ما، هر الگوریتم مسیریابی میتواند به کلاس جداگانه خود با یک متد buildRoute استخراج شود. این متد مبدا و مقصد را میپذیرد و مجموعهای از نقاط کنترل مسیر را برمیگرداند.
حتی اگر با استدلالهای یکسان، هر کلاس مسیریابی ممکن است مسیر متفاوتی بسازد، کلاس اصلی ناوبری واقعاً به الگوریتم انتخابی اهمیت نمیدهد زیرا کار اصلی آن رندر کردن مجموعهای از نقاط کنترل روی نقشه است. این کلاس یک متد برای تعویض استراتژی مسیریابی فعال دارد، بنابراین مشتریان آن، مانند دکمهها در رابط کاربری، میتوانند رفتار مسیریابی انتخاب شده فعلی را با دیگری جایگزین کنند.
مقایسه با دنیای واقعی
استراتژیهای مختلف برای رسیدن به فرودگاه
تصور کنید که باید به فرودگاه بروید. میتوانید سوار اتوبوس شوید، تاکسی بگیرید یا روی دوچرخه خود سوار شوید. اینها استراتژیهای حمل و نقل شما هستند. میتوانید بسته به عواملی مانند بودجه یا محدودیتهای زمانی، یکی از این استراتژیها را انتخاب کنید.
ســاخــتـــار
برای مطـالعـه متن کامل مقالــه، مجموعه کــــدها، نحوه پیاده سازی، مزایا و معایب و روابط با الگوهای دیگر، ایــنــجـــا کلیک کنید.