如何创建灵活的MVC结构?

时间:2012-09-02 10:55:54

标签: java model-view-controller design-patterns user-interface flexibility

作为我目前正在进行的培训计划的一部分,我的任务是开发一个简单的基于命令行的帮助台应用程序。该项目的目的是培养我们使用设计模式,SOLID原则,MVC架构等的能力。

我在理解如何保持MVC结构的灵活性方面遇到了问题。以下是我的代码的一部分示例......

public class RegisterController 
{   
    View view;
    RegisterModel registerModel;

    public RegisterController()
    {
        registerModel = new RegisterModel();
    }

    public void processRegistration(String username, String password, Role role)
    {
        if(registerModel.isRegisterable(username, password))
        {
            User newUser = new User(username, password, role);
            registerModel.registerUser(newUser);
            view = new LoginView(new LoginController());
        }
        else
        {
            System.out.println("ERROR during registration.");
            view = new MainView(new MainController());
        }

        view.startView();
    }
}

我理想地希望能够在以后进入并用不同的用户界面(视图类)替换它,例如一个网页,不改变我的模型或控制器。但是,目前您可以看到我正在编写命令行“MainView”和“LoginView”类的具体实现。

如何使此控制器代码更灵活,并允许使用不同的用户界面进行替换,只需最少的代码修改?在更改为不同的UI时,期望控制器代码保持不变是不现实的吗?

1 个答案:

答案 0 :(得分:1)

MVC / MVP设计模式的一个主要好处是,它们允许您在模拟视图和模型的同时对演示者进行单元测试。

因此,我总是建议构造控制器/展示器,并将视图和模型作为参数传递给构造函数。如果视图和模型作为接口类型传递,则可以在具有模拟对象的测试场景中替换它们。在您当前的设计中,在控制器中选择具体实现,这打破了这种范例。

我通常将控制器和视图链接到一个中心位置。但是,这假设控制器不会在构建时立即启动昂贵的计算操作。我不确定是否有完美的答案,但我相信你应该调整你当前的设计以便进行测试。