我正在构建一个基于MVC的Java应用程序/游戏,并尝试使用IoC将对象创建与应用程序逻辑分开。
假设我只有2个实体:Board
和Player
其中
每个都有一个Model
类,一个View
类和一个Controller
类。BoardModel
需要一个PlayerModel
(以处理某些应用程序逻辑),而BoardView
需要一个PlayerView
(以将其呈现在其space内)。
要创建一个新的Player
,我使用一个PlayerFactory
类创建PlayerModel
,PlayerView
和PlayerController
并将它们连接在一起。
问题在于,创建Player
后,我需要PlayerModel
和PlayerView
实例来创建Board
。
我的解决方案是将PlayerModel
,PlayerView
和PlayerController
“包装”到仅包含这3个字段和3个Player
的getters
类中。将Player
传递给BoardFactory
,并在工厂内部使用3吸气剂获得电路板所需的View
和Model
。
我正在做这样的事情:
PlayerFactory pFactory = new PlayerFactory();
Player player = pFactory.build("HUMAN");
BoardFactory bFactory = new BoardFactory();
Board board = bFactory.build(player);
我担心的是“包装”
Player
类。有一个仅容纳3个对象的类有意义吗?
有没有更好的方法可以在不使用IoC容器的情况下将依赖项传递给
Board
? 最佳答案
您的整体方法看起来不错。虽然,我将进行一些更改:PlayerController
和Player
似乎具有相同的责任。我会完全摆脱Player
而只使用PlayerController
伪代码如下所示:
public class PlayerController {
private PlayerView playerView;
private PlayerModel playerModel;
//constructor that intializes playerView and playerModel
public void render() { playerView.render() }
public void moveForward(int steps) {
if(playerModel.canMoveForward()) {
playerView.moveForward(steps);
}
}
}
同样,您可以摆脱
Board
而只使用BoardController
。然后,BoardController
可以依赖于PlayerController
,而不是依赖于Player
。伪代码看起来像: public class BoardController {
private PlayerController playerController;
private BoardView boardView;
private BoardModel boardModel;
//constructor that intializes the dependencies
public void render() {
playerController.render();
boardView.render();
}
public void movePlayerForward(int steps) {
if(!boardModel.isGameOver()) {
playerController.moveForward(steps);
}
}
}
这样,您就可以摆脱实际上没有做太多事情的
Player
和Board
类。或者,您可以将上述类重命名为Player
和Board
。上面的伪代码的另一个优点是,通过实现Tell Dont Ask
原理,最终还使代码更具可读性。