首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MVC架构中从对话框中获取输入

在MVC架构中从对话框中获取输入
EN

Stack Overflow用户
提问于 2016-03-21 10:03:58
回答 1查看 1.5K关注 0票数 4

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 21:03:37

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

首先,所有三个类(模型、视图和控制器)似乎都可以处理输入。

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

Model:保存处理数据的数据和方法

视图:用户界面

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

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

模型

模型负责保存数据,并且有一些处理数据的方法:

代码语言:javascript
运行
复制
class MyModel
{
    private String outcome;
    
    public void checkEvenOdd(int number){
        if(number % 2 == 0)
            outcome = "even";
        else
            outcome = "odd";    
    }
    
    public String getOutcome(){
        return outcome;
    }
}

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

视点

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

代码语言:javascript
运行
复制
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类获得输入。但是它不会直接将输入传递给模型,因为在MVC中,视图和模型并不知道彼此的存在。

主计长

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

代码语言:javascript
运行
复制
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());     
    }
}

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

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

控制器将最终将要显示的结果传递给用户。

运行示例:

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

代码语言:javascript
运行
复制
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程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36127978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档