首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC -我该如何理解它?(java)

MVC -我该如何理解它?(java)
EN

Stack Overflow用户
提问于 2010-12-10 06:47:01
回答 3查看 2K关注 0票数 4

我最近读了很多关于MVC的书,因为我需要学习如何在学校里为一个项目分离模型和图形用户界面。(老师对此只字不提,所以我正试着自己学。)

我相信我理解了bacis的原则,即用actionlisteners来“注册”模型,或者类似的东西。但我就是不能把它写进代码里。我看过几个小程序,但不知何故,它们仍然太大,我无法理解基础知识。

有没有人能给我解释一下,就像给一个5岁的孩子解释一样,或者给我一些链接,或者是一个非常简单的示例程序或者别的什么?非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-10 07:15:56

首先,您需要了解观察者模式。

其基本思想是定义一个对象,该对象在发生更改时通知相关方。(请注意,观察者模式更通用一些--观察者通知观察者“某些事件”。对于MVC来说,这个事件就是“改变了的东西”)

首先,在可观察者和观察者之间定义一个契约

代码语言:javascript
复制
package aaa;

// AN OBSERVER INTERFACE
// This is a contract between an interested party (the OBSERVER) and
//   the thing it would like to know has changed (the OBSERVABLE)
// The OBSERVABLE will call this method whenever its data changes
public interface SomethingChangedListener {
    void somethingChanged(String name, Object newValue);
}

然后定义可观察对象

代码语言:javascript
复制
package aaa;

import java.util.ArrayList;
import java.util.List;

// An OBSERVABLE class
public class Person {
    // STEP 1: keep track of "who cares"
    //         outsiders with interest implement the observer interface
    //         and register with the person to indicate that they care
    private List<SomethingChangedListener> listeners = new ArrayList<SomethingChangedListener>();
    public void addSomethingChangedListener(SomethingChangedListener scl) {
        listeners.add(scl);
    }
    public void removeSomethingChangedListener(SomethingChangedListener scl) {
        listeners.remove(scl);
    }

    // STEP 2: be able to notify those observers by calling a method in the observer interface
    protected void fireSomethingChanged(String name, Object newValue) {
        for (SomethingChangedListener scl : listeners) {
            scl.somethingChanged(name, newValue);
        }
    }

    // STEP 3: whenever the data changes, notify the observers
    private String name;
    private int age;

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
        fireSomethingChanged("age", name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
        fireSomethingChanged("name", name);
    }
}

这允许任何其他对象“监听”它感兴趣的事物的变化,只要它实现了观察者接口。

例如:

代码语言:javascript
复制
package aaa;

public class Test1 {
    private static class TestObserver implements SomethingChangedListener {
        @Override public void somethingChanged(String name, Object newValue) {
            System.out.println("Property '" + name + "' changed to '" + newValue + "'");
        }
    }
    public static void main(String[] args) {
        Person p = new Person();
        p.addSomethingChangedListener(new TestObserver());
        p.setName("Scott");
        p.setAge(43);
    }
}

创建可观察对象(人员)的实例,注册观察者(TestObserver),然后与可观察对象交互。当运行时,我们看到

代码语言:javascript
复制
Property 'name' changed to 'Scott'
Property 'age' changed to 'Scott'

到目前一切尚好。

现在让我们称这个人为我们的模型。该模型表示我们想要操作和查看的数据。

我们可以在“用户界面”中做到这一点。用户界面可以是,但不限于:

  • 图形用户界面
  • 命令行界面
  • 网络应用程序(超文本标记语言、JSP、ASP等)
  • 网络服务(SOAP、REST等)

<代码>F213

每种类型的用户界面(UI)的代码可能截然不同,但概念是相同的。

用户界面(UI)允许用户(例如,一个人或另一台计算机)查看有关模型的信息并对该信息进行更改。

"View“是UI的一部分,它为用户显示信息。它从模型中读取数据,并以某种方式格式化数据以呈现数据。

如果模型发生更改,则必须更新视图。为此,它将观察者注册到模型中。这些观察者只需刷新视图中演示文稿的相关部分。

现在,如果用户想要进行更改,该怎么办?

我们在UI中将"Controller“定义为解释用户与该UI交互的代码。例如,如果用户在"name“字段中键入,则控制器可以将其解释为”将'name‘的值更改为用户键入的文本。

代码语言:javascript
复制
person.setName(textFromField);

调用以更新模型。

还记得setName()方法做什么吗?它将更改通知给观察者。这将导致UI更新其视图。

请注意,“视图”和“控制器”不需要是单独的类;它们通常是组合在一起的。真正需要理解的是“视图”( UI中显示模型数据的部分)和“控制器”( UI中解释用户交互并更新模型的部分)的角色。

在某些设置中,例如Web应用程序,视图和控制器是完全分开的。控制器解释向服务器发出的HTTP请求,并更新模式。视图将HTML响应呈现给用户。(如果您正在做一个AJAX应用程序,那么它的设计有点类似于GUI)

MVC分离(Model vs UI)的酷之处在于,您可以随时在模型中添加或删除UI,并且可以在同一模型上拥有多个UI。如果在一个UI中更改了数据,则会更新所有其他UI以反映此更改。

很酷,是吧?

票数 4
EN

Stack Overflow用户

发布于 2010-12-10 06:53:33

现在,关于MVC最基本的事情就是分离M,V和C。,,the,,C.,MVC。

一方面,你有自己的类,以及做一些事情的代码,比如计算两个输入数的和,或者对数据库做一些事情,不管是什么。这就是你的模型。

在另一边,你有一些其他的类,它们负责表单,文本输入,按钮和屏幕上可见的东西。这就是视图。

现在,Controller是连接这两者的人。通常(比如在Swing中),您会让控制器实现侦听器接口,然后将控制器作为侦听器添加到您希望软件对其做出反应的屏幕组件中,如按钮。实现的处理程序方法除了调用您在Model中实现的任何方法外,不会做任何其他事情。

我希望这能让事情变得更清楚。

票数 4
EN

Stack Overflow用户

发布于 2010-12-10 06:51:00

This图可以帮助你理解Java中的MVC的关系

UI组件是View,Control servlet (在这里捕获所有传入的请求并将它们重定向到正确的业务对象)是Controller,业务对象是Model。

这就是我对java中的MVC的解释。欢迎其他答案。

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

https://stackoverflow.com/questions/4403903

复制
相关文章

相似问题

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