Сегодня мы попытаемся понять шаблон стратегии с помощью примера.
Пример, который мы рассмотрим — игра в шахматы. Цель состоит в том, чтобы объяснить шаблон стратегии, а не построить комплексное решение для игры в шахматы.
Шаблон стратегии. Шаблон стратегии известен как шаблон поведения — он используется для управления алгоритмами, отношениями и обязанностями между объектами. Основным преимуществом шаблона стратегии является выбор алгоритма / поведения во время выполнения.
Давайте попробуем понять это, реализовав это для разработки игры в шахматы.
В шахматах есть разные персонажи, такие как Король, Королева, Епископ, и все они имеют разные движения. Там может быть много возможных решений для этого дизайна, давайте рассмотрим одно за другим:
- Первый способ — определить движение в каждом классе, у каждого персонажа будет своя реализация move (). Таким образом, нет возможности повторного использования кода, и мы не можем изменить реализацию во время выполнения.
- Создайте отдельный класс MovementController и добавьте if if для каждого типа перемещения объекта.
01
02
03
04
05
06
07
08
09
10
11
12
|
public class BadDesginCharacterMovementController { public void move(Character character){ if (character instanceof King){ System.out.print( "Move One Step forward" ); } else if (character instanceof Queen){ System.out.print( "Move One Step forward" ); } else if (character instanceof Bishop){ System.out.print( "Move diagonally" ); } } } |
Это плохой дизайн, с сильной связью, более того, использование if / else делает его уродливым.
Итак, нам бы хотелось иметь дизайн, в котором мы могли бы иметь слабую связь, где мы могли бы выбирать алгоритм движения во время выполнения и иметь возможность повторного использования кода.
Давайте посмотрим на эту полную реализацию, используя шаблон стратегии.
Ниже приведена диаграмма классов нашей реализации:
- Полный исходный код можно скачать здесь .
У нас будет базовый абстрактный класс в виде Character Class, который могут расширять все символы и устанавливать собственную реализацию MovementBehaviour.
01
02
03
04
05
06
07
08
09
10
11
12
|
public class Character { private MovementBehaviour movementBehaviour; String move(){ return movementBehaviour.move(); } public void setMovementBehaviour(MovementBehaviour movementBehaviour) { this .movementBehaviour = movementBehaviour; } } |
У этого класса есть Поведение движения:
1
2
3
4
|
public interface MovementBehaviour { String move(); } |
Таким образом, каждый Персонаж: Король, Королева, Епископ будут расширять Персонажа, и они могут иметь свою собственную реализацию Поведения Движения.
1
2
3
4
5
6
|
public class King extends Character { public King() { setMovementBehaviour( new SingleForward()); } } |
Здесь для простоты я вызвал метод setMovemementBehaviour
внутри конструктора King.
Точно так же другой персонаж Queen может быть определен как:
1
2
3
4
5
6
|
public class Queen extends Character { public Queen() { setMovementBehaviour( new SingleForward()); } } |
И епископ как:
1
2
3
4
5
6
|
public class Bishop extends Character { public Bishop() { setMovementBehaviour( new DiagonalMovement()); } } |
Реализация различных движений может быть следующей:
Одиночный Форвард:
1
2
3
4
5
6
7
|
public class SingleForward implements MovementBehaviour { @Override public String move() { return "move one step forward" ; } } |
Диагональное движение:
1
2
3
4
5
6
7
|
public class DiagonalMovement implements MovementBehaviour { @Override public String move() { return "Moving Diagonally" ; } } |
На этом примере мы можем понять шаблон стратегии.
Ссылка: | Понимание модели стратегии путем разработки игры в шахматы от нашего партнера JCG Анируд Бхатнагар в блоге Анирудх Бхатнагар. |