Стратегія на Go
Стратегія — це поведінковий патерн, який виносить набір алгоритмів у власні класи і робить їх взаємозамінними.
Інші об’єкти містять посилання на об’єкт-стратегію та делегують їй роботу. Програма може підмінити цей об’єкт іншим, якщо потрібен інший спосіб вирішення завдання.
Концептуальний приклад
Уявіть, що ви розробляєте «In-Memory-Cache». Оскільки він розташований всередині пам’яті, його розмір обмежений. Щойно він вщент заповниться, якісь записи доведеться прибрати, аби звільнити простір. Цю функцію можна реалізувати завдяки декільком алгоритмам, найпопулярніші серед них:
- Найбільш давно використовувалися (Least Recently Used — LRU): прибирає запис, який використовувався найбільш давно.
- «Першим прийшов, першим пішов» (First In, First Out — FIFO): прибирає запис, який був створений раніше за інші.
- Найменш часто використовувалися (Least Frequently Used — LFU): прибирає запис, який використовувався найменш часто.
Проблема полягає в тому, щоб відокремити кеш від цих алгоритмів для можливості їх заміни «на ходу». Крім цього, клас кешу мусить не змінюватися при додаванні нового алгоритму.
У такій ситуації нам допоможе патерн Стратегія. Він передбачає створення сімейства алгоритмів, кожен з яких має свій клас. Всі класи застосовують однаковий інтерфейс, що робить алгоритми взаємозамінними всередині цього сімейства. Назвемо цей загальний інтерфейс evictionAlgo
.
Тепер основний клас нашого кеша включатиме у себе evictionAlgo
. Замість прямої реалізації всіх типів алгоритмів витіснення всередині самого себе, наш клас передаватиме їх в evictionAlgo
. Оскільки це інтерфейс, ми можемо безпосередньо під час виконання програми змінювати алгоритм на LRU, FIFO, LFU без змін у класі кеша.