Статьи

Понимание модели стратегии при разработке игры в шахматы

Сегодня мы попытаемся понять шаблон стратегии с помощью примера.

Пример, который мы рассмотрим — игра в шахматы. Цель состоит в том, чтобы объяснить шаблон стратегии, а не построить комплексное решение для игры в шахматы.

Шаблон стратегии. Шаблон стратегии известен как шаблон поведения — он используется для управления алгоритмами, отношениями и обязанностями между объектами. Основным преимуществом шаблона стратегии является выбор алгоритма / поведения во время выполнения.

strategypattern

Давайте попробуем понять это, реализовав это для разработки игры в шахматы.

В шахматах есть разные персонажи, такие как Король, Королева, Епископ, и все они имеют разные движения. Там может быть много возможных решений для этого дизайна, давайте рассмотрим одно за другим:

  1. Первый способ — определить движение в каждом классе, у каждого персонажа будет своя реализация move (). Таким образом, нет возможности повторного использования кода, и мы не можем изменить реализацию во время выполнения.
  2. Создайте отдельный класс 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 Анируд Бхатнагар в блоге Анирудх Бхатнагар.