MVC - Как это понять? (Джава) - PullRequest
4 голосов
/ 10 декабря 2010

В последнее время я много читаю о MVC, потому что мне нужно научиться разделять модель и GUI для проекта в школе.(Учитель ничего не сказал об этом, поэтому я пытаюсь выучить это сам),Но я просто не могу получить это в коде.Я посмотрел несколько небольших программ, но они все еще слишком велики, чтобы я мог понять основы.

Может ли кто-нибудь объяснить это как объяснение 5-летнему ребенку, или дать мне несколько ссылок или действительно простой пример программы или что-то еще?Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 10 декабря 2010

Теперь, очень простая вещь в MVC - это разделить M, V и C.

С одной стороны у вас есть ваши классы и код, который что-то делает, например, вычисляет суммудва входных числа, или что-то делает с базой данных, что угодно.Это ваша модель.

С другой стороны у вас есть другие классы, которые отвечают за формы, ввод текста, кнопки и вещи, видимые на экране.Это представление.

Теперь контроллер связывает эти два.Обычно (скажем, Swing) ваш контроллер должен реализовывать интерфейсы Listener, затем вы добавляете контроллер в качестве слушателя к компонентам экрана, на которые вы хотите, чтобы ваше программное обеспечение реагировало, например, кнопки.И реализованный метод обработчик не будет делать ничего другого, кроме вызова любого метода, который вы реализовали в вашей модели.

Надеюсь, это сделало его более понятным ..

4 голосов
/ 10 декабря 2010

Во-первых, вам нужно понять паттерн Observer.

Основная идея заключается в том, что вы определяете объект, который уведомляет заинтересованные стороны об его изменении. (Обратите внимание, что шаблон Observer немного более общий - Observables уведомляет Observers о «некотором событии». Для MVC это событие «что-то изменило»)

Сначала вы определяете контракт между НАБЛЮДАЕМЫМ и НАБЛЮДАТЕЛЕМ

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);
}

Затем вы определяете НАБЛЮДАЕМЫЙ

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);
    }
}

Это позволяет любому другому объекту "прослушивать" изменения в предмете, который его интересует, при условии, что он реализует этот интерфейс наблюдателя.

Например:

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) и затем взаимодействует с Наблюдаемой. При запуске мы видим

Property 'name' changed to 'Scott'
Property 'age' changed to 'Scott'

Пока все хорошо.

Теперь давайте назовем Человека нашей МОДЕЛЬЮ. МОДЕЛЬ представляет данные, которыми мы хотим манипулировать и просматривать.

Мы можем сделать это в «пользовательском интерфейсе». Пользовательский интерфейс может быть, но не ограничен:

  • Графический интерфейс пользователя (GUI)
  • Интерфейс командной строки (CLI)
  • Веб-приложение (HTML, JSP, ASP и т. Д.)
  • Веб-сервис (SOAP, REST и т. Д.)

Код для каждого из этих типов пользовательских интерфейсов (UI) может существенно отличаться, но концепции совпадают.

Пользовательский интерфейс (UI) позволяет пользователю (например, человеку или другому компьютеру) просматривать информацию о модели и вносить изменения в эту информацию.

«Вид» - это часть пользовательского интерфейса, которая отображает информацию для пользователя. Он считывает данные из модели и каким-то образом форматирует их для представления.

Если модель изменится, представление должно быть обновлено. Для этого он регистрирует наблюдателей с помощью модели. Эти наблюдатели просто обновляют соответствующие части презентации в представлении.

А что будет, если пользователь захочет внести изменения?

Мы определяем «Контроллер» в пользовательском интерфейсе как код, который интерпретирует взаимодействие пользователя с этим пользовательским интерфейсом. Например, если пользователь вводит в поле «имя», контроллер может интерпретировать это как «изменить значение« имя »на текст, введенный пользователем. Контроллер делает

person.setName(textFromField);

позвоните, чтобы обновить модель.

Помните, что делает этот метод setName ()? Он уведомляет наблюдателей об изменениях. Это заставит пользовательский интерфейс обновить свое представление.

Обратите внимание, что "view" и "controller" не обязательно должны быть отдельными классами; они часто объединяются. На самом деле важно понимать «представление» (часть пользовательского интерфейса, который отображает данные модели) и «контроллер» (часть пользовательского интерфейса, который интерпретирует взаимодействие с пользователем и обновляет модель), которые важны для понимания.

В некоторых настройках, таких как веб-приложения, представление и контроллер очень разные. Контроллер интерпретирует HTTP-запросы к серверу и обновляет режим. Представление предоставляет HTML-ответы пользователю. (Если вы работаете с приложением AJAX, дизайн немного больше похож на GUI)

Отличительной особенностью разделения MVC (Модель против пользовательского интерфейса) является то, что вы можете добавлять или удалять пользовательские интерфейсы из Модели в любое время и иметь несколько пользовательских интерфейсов в одной модели. Если данные изменяются в одном пользовательском интерфейсе, все остальные пользовательские интерфейсы обновляются, чтобы отразить это изменение.

Круто, а?

2 голосов
/ 10 декабря 2010

Эта диаграмма может помочь вам понять взаимосвязь MVC в Java

Компонент пользовательского интерфейса - это сервлет View, Control (просто перехватите все входящие запросы и перенаправьте их на правильный бизнес-объект) - это Controller, а бизнес-объекты - это модель.

Это моя интерпретация MVC в Java. Другие ответы приветствуются.

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...