Шаблон стратегии - это шаблон проектирования поведения, который позволяет вам определить семейство алгоритмов, инкапсулировать их в виде объекта и с помощью признаков сделать их взаимозаменяемыми.
На что это похоже?
Краткое объяснение:
- Контекст хочет применить какой-то алгоритм, и для этой цели он содержит объект, который реализует интерфейс стратегии.
- Когда требуется стратегия, инициируется объект `StrategyA` или `StrategyB` и вызывается метод `algorithm`.
Можно было бы утверждать, что это форма внедрения зависимостей, поскольку методы вызываются только в интерфейсе, а не в конкретных объектах.
Реализация в Rust
Откройте свой терминал в пустом каталоге и введите:
Затем откройте свою IDE и откройте main.rs в папке src.
Мы начнем с определения `TravelStrategy`, поэтому добавьте в main.rs:
Затем мы определим TrainStrategy:
Структура `TrainStrategy` пустая. Мы реализуем в ней метод перемещения, который просто выводит пройденное расстояние.
`CarStrategy` аналогична:
Теперь, чтобы иметь возможность отправить всех в путь, мы начнем с определения `TravelHub`:
Здесь мы используем дженерики, `T:TravelStrategy` означает, что у нас может быть любой тип, если он реализует признак `TravelStrategy`.
Почему дженерики? Дженерики облегчают передачу в конкретном классе, не прибегая к коробочным типам или чему-то подобному, и это делает код намного более читаемым.
Теперь пишем `TravelHub`:
Краткое пояснение:
- Сначала мы определяем конструктор, который получает конкретный класс в качестве своего параметра. Этот класс должен реализовывать атрибут `TravelStrategy`.
- Затем у нас есть `customer_travel`, который просто вызывает метод путешествия по выбранной стратегии.
Посмотрим, сработает ли это:
- Создайте экземпляр `travelhub` с `TrainStrategy` в качестве параметра. Поскольку `TrainStrategy` реализует свойство `TravelStrategy`, мы можем передать это в качестве параметра.
- Вызовите метод `customer_travel`, чтобы посмотреть, все ли работает.
Вывод
Как вы можете видеть, реализация довольно проста. Использование дженериков позволяет обойти использование коробчатых конструкций. Это делает код намного более читабельным.
Этот шаблон также можно было бы назвать формой внедрения зависимостей, поскольку вызываются только методы в интерфейсах, где вызывающий не знает о базовом классе.
Статья на list-site.