2016-07-27 2 views
2

Я пытаюсь обращал внимание на шаблон стратегии и придумал следующий пример:Как удалить круговую зависимость от использования шаблона стратегии?

  • Я хотел бы создать новые игры, основанные на шахматы за исключением частей, которые двигаются по-разному.
  • Я также хочу использовать шаблон стратегии, чтобы ввести поведение (как они могут перемещаться) в части.

Но если у нас есть Board, Piece и MoveBehavior объекты

  • Board ->Piece потому что Board содержит Piece s
  • Piece ->Board потому что часть должна пройти в Board как a параметр
    • MoveBehavior, которому необходим Board, чтобы решить, какие шаги приемлемы.

Как мы можем избавиться от этой круговой зависимости? Кроме того, не является ли это общей проблемой в более реалистичных примерах, потому что поведение требует достаточно большого состояния для принятия решений? Я думаю, что если поведение суперпросто, дело не в том, чтобы не использовать шаблон стратегии.

ответ

1

Я бы просто использовал Board ->Piece ->MoveBehaviour.

Причина в том, что на доске есть куски, а части имеют собственное поведение перемещения в зависимости от того, какой тип они есть.

MoveBehaviour говорит часть его разрешенные движения И.Е. (пример C#, потому что это то, что я знаком с)

public Move[] Moves 
{ 
    get 
    { 
     return new Move[] { Move.Horizontal, Move.Vertical }; 
    } 
} 

Работа MoveBehaviour не увидеть, если Piece может перемещаться туда, где он просит это доска.

Более легко объясняется ниже C# Например:

public class Board 
{ 
    public List<Piece> Pieces { get; set; } 

    public bool CanMoveTo(Piece piece, Point location) { /*...*/ } 
} 

public class Piece : IMoveBehaviour 
{ 
    public Move[] Moves { get; set; } 
} 

public interface IMoveBehaviour 
{ 
    Move[] moves { get; set; } 
} 

И с методами Board и Piece как RequestMove, Move, IsValidMove и т.д ...

По существу оставить ответственность за то, что в чем-то и не перемещайте его. MoveBehaviour - это поведение Piece, а не проверка ходов, которая является ответственностью Board.

3

Похоже, вы можете использовать инфраструктуру инъекции зависимостей для разрешения всех экземпляров объекта. Вам понадобится настраиваемый контейнер, если вы хотите использовать разные комбинации типов для создания экземпляра. Вы можете назвать конфигурируемый контейнер стратегией (поскольку он выбирает все фигуры, которые входят в игру).

Я бы не стал советом директоров создавать все фигуры и поведения, а использовал для этого класс композитора (который использует инъекцию зависимостей).

Это позволяет вам (например) использовать поведение для доски или создавать различные типы плат.

См. Также this question and answer для получения дополнительной информации о том, как инъекция зависимости помогает получить свободную связь.

Смежные вопросы