Во-первых, вам нужно понять паттерн 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 (Модель против пользовательского интерфейса) является то, что вы можете добавлять или удалять пользовательские интерфейсы из Модели в любое время и иметь несколько пользовательских интерфейсов в одной модели. Если данные изменяются в одном пользовательском интерфейсе, все остальные пользовательские интерфейсы обновляются, чтобы отразить это изменение.
Круто, а?