这听起来像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()));
}
}
}
您的控制器的主要作用现在将听取由调度的事件模型,然后相应地更新View(DisplayList)。就像明智的一样,你的视图应该根据用户交互来派发事件(例如:玩家之一表示他们希望将一块物品放入第二列);控制器可以调用模型上的相关方法。
下面的代码段应该给你一些关于控制器的职责是什么的指示;不要忘记,您可以(也应该!)通过使用多个模型,视图和(如果需要的话)控制器来降低您的责任。
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();
}
}
这太棒了,谢谢我完全按照逻辑。我想为GridModel和GameState创建单独的类,但是我陷入了懒惰的旧陷阱,并且问'它真的需要它自己的类吗?'即使在这个层面上,我当然也看到了解除这种关系的力量。 – ChickensDontClap 2011-05-21 12:23:55
将GameStateModel与GridModel分开的一个原因是要改变玩家的数量; GridModel并不关心有多少人在玩游戏,这是GameStateModel的责任。通过使用多态性,您可以轻松地在TwoPlayerGameStateModel和ThreePlayerGameStateModel之间进行切换。 – JonnyReeves 2011-05-21 14:17:05