На этот раз я хочу поговорить о шаблоне проектирования стратегии . Таким образом, я начинаю статьи о поведенческих шаблонах дизайна . Шаблоны такого типа представляют некоторые схемы взаимодействия между объектами, чтобы сделать код более гибким и хорошо организованным. Наиболее важным моментом этого подхода является слабая связь между объектами.
Стратегия должна использоваться, когда у вас есть несколько реализаций для одной цели в вашем приложении. В этом случае вы создаете интерфейс стратегии, конкретные реализации интерфейса и, наконец, класс контекста, который будет инкапсулировать всю логику в некоторых методах. Чтобы понять этот подход, давайте рассмотрим пример.
Пример будет основан на футболе. Давайте представим, что любая футбольная команда может играть двумя способами: атаковать и защищаться. Эти две тактики являются частной реализацией футбольной стратегии.
Интерфейс стратегии:
1
2
3
4
5
|
public interface FootballStrategy { public void adhereTactic(String team); } |
Конкретные реализации:
1
2
3
4
5
6
7
8
|
public class AttackTactic implements FootballStrategy { @Override public void adhereTactic(String team) { System.out.println(team+ " will play in attacking football!" ); } } |
И
1
2
3
4
5
6
7
8
|
public class DefenceTactic implements FootballStrategy { @Override public void adhereTactic(String team) { System.out.println(team+ " will make emphasis on defence!" ); } } |
Контекстный класс:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public class TacticContext { private FootballStrategy strategy = null ; public void selectTactic(String team) { strategy.adhereTactic(team); } public FootballStrategy getStrategy() { return strategy; } public void setStrategy(FootballStrategy strategy) { this .strategy = strategy; } } |
Демонстрация использования Стратегии:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
... public static void main(String[] args) { String team1 = "Barcelona" ; String team2 = "Real Madrid" ; TacticContext context = new TacticContext(); context.setStrategy( new AttackTactic()); context.selectTactic(team1); context.setStrategy( new DefenceTactic()); context.selectTactic(team2); } ... |
Результат выполнения кода:
Барселона сыграет в атакующий футбол!
Реал Мадрид сделает упор на оборону!
Когда использовать шаблон дизайна Стратегии? Определенно, когда клиенту не нужно знать о реализации конкретных стратегий или о данных, которые там используются. Когда вы хотите использовать один класс из набора динамически. Я не знаю, какие ситуации мне также нужно упомянуть сейчас. Но я уверен, что мой пример был многословным, и вы можете сделать свой собственный вывод о плюсах и минусах шаблона проектирования Стратегии.