Похоже, что GridController будет страдать от смешанных обязанностей; в архитектурах MVC ответственность Контроллера состоит в том, чтобы перетаскивать данные назад и вперед от Модели к Представлению. Лично я хотел бы рассмотреть GridModel, который будет содержать базовый многомерный массив, который представляет сетку и методы для добавления частей, например:
public class GridModel extends EventDispatcher {
private var _grid : Array;
public function GridModel(rows : uint, cols : uint) : void {
// Create the data structure which represents the Grid.
_grid = initialiseGrid(rows, cols);
}
public function addPiece(player : uint, col : uint) : void {
if (isValidMove(col)) {
// Update the datastructure, determine which row the piece ended
// up residing in.
const row : uint = // method omitted
// Notify the rest of the system that a move has been made.
dispatchEvent(new GridUpdateEvent(GridUpdateEvent.MOVE, player, col, row, _grid.concat());
}
else {
// Illegal Move, datastructure stays the same, notify the rest
// of the system.
dispatchEvent(new IllegalMoveEvent(IllegalMoveEvent.COLUMN_FULL, player, col, _grid.concat()));
}
}
}
Основная роль вашего контроллера теперь будет заключаться в том, чтобы прослушивать события, отправляемые моделью, а затем соответствующим образом обновлять представление (DisplayList). Аналогично, ваш View должен отправлять События на основе взаимодействия с пользователем (например: Player один указал, что он хочет поместить кусок во 2-й столбец); Контроллер может затем вызвать соответствующий метод в Модели.
Следующий фрагмент должен дать вам некоторое представление о том, каковы обязанности Контроллера; не забывайте, что вы можете (и должны!) разделять свои обязанности, используя несколько моделей, представлений и, при необходимости, контроллеров.
public class GameController {
private var _gridModel : GridModel;
private var _stateModel : GameStateModel;
private var _gridView : GridView;
public function GameController(gridModel : GridModel, gameStateModel : GameStateModel, gridView : GridView) {
_gridModel = gridModel;
_gameStateModel : gameStateModel;
_gridView = gridView;
addEventListeners();
}
private function addEventListeners() : void {
_gridModel.addEventListener(GridUpdateEvent.MOVE, onGridUpdateMoveEvent);
_gridView.addEventListener(ColumnSelectionEvent.SELECTED, onColumnSelectedEvent);
}
private function onColumnSelectedEvent(event : ColumnSelectionEvent) : void {
// Query the GameStateModel to find out whos turn it currently is.
const activePlayer : uint = _gameStateModel.activePlayer;
// Ask the GridModel to update.
_gridModel.addPiece(activePlayer, event.column);
}
private function onGridUpdateMoveEvent(event : GridUpdateEvent) : void {
// Update the view.
_gridView.insertPiece(event.player, event.row, event.col);
// Update the GameState to indicate it's the next player turns.
_gameSate.completeTurn();
}
}