Привет, друзья! Сегодня разберём Strategy — мощный паттерн, который позволяет менять поведение объекта на лету без тонны условных выражений if/else.
⚠️ Суть паттерна:
🔸 Выносим разные алгоритмы в отдельные классы.
🔸 Основной объект делегирует работу этим алгоритмам.
🔸 Можно подменять логику прямо во время выполнения.
🔸 Зависим от протокола, а не от конкретного класса.
♣️ Пример:
Допустим, у нас есть персонаж, который может:
🔹 Ходить.
🔹 Бегать.
🔹 Летать.
Вместо простой реализации:
enum Movement {
case walk, run, fly
}
class Character {
func move(type: Movement) {
switch type {
case .walk: print("Идёт")
case .run: print("Бежит")
case .fly: print("Летит")
}
}
}
Напишем элегантно через Strategy:
protocol MovementStrategy {
func move()
}
class WalkStrategy: MovementStrategy {
func move() { print("Идёт пешком") }
}
class FlyStrategy: MovementStrategy {
func move() { print("Летит на реактивном ранце") }
}
class GameCharacter {
private var strategy: MovementStrategy
init(strategy: MovementStrategy) {
self.strategy = strategy
}
func setStrategy(_ strategy: MovementStrategy) {
self.strategy = strategy
}
func performMove() {
strategy.move()
}
}
// Использование
let hero = GameCharacter(strategy: WalkStrategy())
hero.performMove() // Идёт пешком
hero.setStrategy(FlyStrategy())
hero.performMove() // Летит на реактивном ранце
✅ Плюсы подхода:
🔹 Гибкость: новые стратегии добавляются без изменения основного класса.
🔹 Тестируемость: можно подменять реальные стратегии моками, проверяя логику изолированно.
🔹 Чистый код: нет гигантских switch-блоков.
💡 Вывод:
Паттерн Strategy делает код гибким и чистым, позволяя менять поведение объекта на лету без условных конструкций. Он идеально подходит для сценариев, где нужно быстро добавлять новые алгоритмы или тестировать разные варианты поведения через моки.
➡️ Подписаться на канал
Мобильный трудоголик