我正在构建一个基于MVC的Java应用程序/游戏,并尝试使用IoC将对象创建与应用程序逻辑分开。

假设我只有2个实体:BoardPlayer其中
每个都有一个Model类,一个View类和一个Controller类。

BoardModel需要一个PlayerModel(以处理某些应用程序逻辑),而BoardView需要一个PlayerView(以将其呈现在其space内)。

要创建一个新的Player,我使用一个PlayerFactory类创建PlayerModelPlayerViewPlayerController并将它们连接在一起。

问题在于,创建Player后,我需要PlayerModelPlayerView实例来创建Board

我的解决方案是将PlayerModelPlayerViewPlayerController“包装”到仅包含这3个字段和3个Playergetters类中。将Player传递给BoardFactory,并在工厂内部使用3吸气剂获得电路板所需的ViewModel

我正在做这样的事情:

PlayerFactory pFactory = new PlayerFactory();
Player player = pFactory.build("HUMAN");
BoardFactory bFactory = new BoardFactory();
Board board = bFactory.build(player);


我担心的是“包装” Player类。
有一个仅容纳3个对象的类有意义吗?
有没有更好的方法可以在不使用IoC容器的情况下将依赖项传递给Board

最佳答案

您的整体方法看起来不错。虽然,我将进行一些更改:

PlayerControllerPlayer似乎具有相同的责任。我会完全摆脱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);
       }
    }
 }


这样,您就可以摆脱实际上没有做太多事情的PlayerBoard类。或者,您可以将上述类重命名为PlayerBoard。上面的伪代码的另一个优点是,通过实现Tell Dont Ask原理,最终还使代码更具可读性。

10-01 00:24