Стратегия на Go
Стратегия — это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми.
Другие объекты содержат ссылку на объект-стратегию и делегируют ей работу. Программа может подменить этот объект другим, если требуется иной способ решения задачи.
Концептуальный пример
Представьте, что вы разрабатываете «In-Memory-Cache». Поскольку он находится внутри памяти, его размер ограничен. Как только он полностью заполнится, какие-то записи придется убрать для освобождения места. Эту функцию можно реализовать с помощью нескольких алгоритмов, самые популярные среди них:
- Наиболее давно использовавшиеся (Least Recently Used – LRU): убирает запись, которая использовалась наиболее давно.
- «Первым пришел, первым ушел» (First In, First Out — FIFO): убирает запись, которая была создана раньше остальных
- Наименее часто использовавшиеся (Least Frequently Used — LFU): убирает запись, которая использовалась наименее часто.
Проблема заключается в том, чтобы отделить кэш от этих алгоритмов для возможности их замены «на ходу». Помимо этого, класс кэша не должен меняться при добавлении нового алгоритма.
В такой ситуации нам поможет паттерн Стратегия. Он предполагает создание семейства алгоритмов, каждый из которых имеет свой класс. Все классы применяют одинаковый интерфейс, что делает алгоритмы взаимозаменяемыми внутри этого семейства. Назовем этот общий интерфейс evictionAlgo
.
Теперь основной класс нашего кэша будет включать в себя evictionAlgo
. Вместо прямой реализации всех типов алгоритмов вытеснения внутри самого себя, наш класс будет передавать их в evictionAlgo
. Поскольку это интерфейс, мы можем непосредственно во время выполнения программы менять алгоритм на LRU, FIFO, LFU без изменений в классе кэша.