【问题标题】:Getting input from dialog in an MVC architecture从 MVC 架构中的对话框获取输入
【发布时间】:2016-07-07 18:44:56
【问题描述】:

我在 Swing 中使用 Java,想知道是否有关于从对话框获取输入的最佳实践。我正在使用 MVC 架构,我不确定是否应该从模型、视图或控制器中完成。

【问题讨论】:

  • 控制器负责向视图询问输入文本
  • View 是从用户获取输入并将其传递给控制器​​的层。例如,如果您使用 Swing,用户将在窗口 [View] 中填充 JTextFields 值,并且在按下提交按钮时,必须向 Controller 提供这些值以处理它们并决定下一步 [Controller]跨度>
  • 来自用户的信息应该“可能”从视图本身完成,但随后会引发一些关于上下文的问题。考虑到视图会通过某些事件向控制器询问更多信息并不是不合理的,在这种情况下,它将向用户呈现一个对话框(可能通过另一个控制器/视图),然后将该信息返回给原始视图
  • @Jason Queen 看看下面我的解决方案。

标签: java swing oop model-view-controller


【解决方案1】:

我在 Swing 中使用 Java,想知道是否有关于从对话框获取输入的最佳实践。我正在使用 MVC 架构,我不确定是否应该从模型、视图或控制器中完成。

乍一看,所有 3 个类(模型、视图和控制器)似乎都可以处理输入。

但是,如果我们考虑每个类的角色和职责,就不难确定哪个类适合接受输入。

模型:保存您的数据和处理数据的方法

视图:用户界面

控制器:模型和视图之间的协调器


用最简单的例子来阐述想法;一个程序,它接收一个数字(使用 JOptionPane)并显示一条消息,说明它是 odd 还是 even(通过 JOptionPane)。

模型

模型负责保存数据,以及一些处理数据的方法:

class MyModel
{
    private String outcome;
    
    public void checkEvenOdd(int number){
        if(number % 2 == 0)
            outcome = "even";
        else
            outcome = "odd";    
    }
    
    public String getOutcome(){
        return outcome;
    }
}

毕竟,模型只负责保存数据和逻辑,因此它将把获取数据的工作留给其他人。


视图

View 是用户将与之交互的界面。

class MyView
{
    public int promptNumber(){
        int num = 0;
        String s = JOptionPane.showInputDialog("Enter a number to test whether it is even or odd.");
        if(s.matches("\\d+"))  //if is numeric
            num = Integer.parseInt(s);
        else
            throw new IllegalArgumentException("Numeric input required.");
        
        return num;                 
    }
    
    public void displayResult(String result){
        JOptionPane.showMessageDialog(null, result, "Result", JOptionPane.INFORMATION_MESSAGE);
    }   
}

视图不会保存数据,也不会执行任何计算或逻辑实现。它只负责与用户交互。看到“互动”这个词了吗?是的,我们将通过 View 类获得输入。但它不会直接将输入传递给Model,因为在MVC中,View和Model并不知道对方的存在。


控制器

由于模型和视图不相互交互,我们需要一个协调器来协调两个类(模型和视图)。

class MyController
{
    private MyModel model;  
    private MyView view;


    public MyController(MyModel model, MyView view){
        this.model = model;
        this.view = view;       
    }
    
    public void start(){
        int num = view.promptNumber();
        model.checkEvenOdd(num);
        view.displayResult(model.getOutcome());     
    }
}

如果给定输入,控制器将要求视图与接收输入的用户进行交互。

然后将输入传递给模型进行处理。 Model 会将处理后的结果传回给 Controller。

Controller 最终会将结果传递给 View 以显示给用户。


运行示例:

为了驱动示例,我们创建它们的实例并运行程序:

class MVCExample
{
    public static void main(String[] args){
        MyModel model = new MyModel();
        MyView view = new MyView();
        MyController controller = new MyController(model, view);                
        controller.start();
    }
}

结论

我不确定是否应该从模型、视图或控制器中完成。

如果我们从逻辑上考虑每个类(模型、视图和控制器)的角色和职责,我会说 视图 将负责接收输入。这也适用于控制台或 Swing 程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2023-03-25
    • 2011-02-24
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多