Я изучаю MVC с точки зрения Командной строки (не сеть и никакая платформа).. хороший и простой. единственной вещью, которая смущает меня, является часть Представления этого? (хорошо это не может быть единственное, но это - основное),
от сайта IBM представление имеет следующее определение
Представление обеспечивает представление модели. Это - вид приложения. Представление может получить доступ к образцовым методам get, но оно не знает о методах set. Кроме того, это ничего не знает о контроллере. Представление должно быть уведомлено, когда изменения в модели происходят.
Таким образом, если у меня есть следующее:
Модель
Посмотреть
Контроллер
Мой контроллер человека мог передать объект человека представлению EditPeronDetails, однако как мое представление редактирует человека, если это не может получить доступ к своим методам set, как я могу отредактировать человека?
Также действительно ли представление классифицирует, только делают одну вещь? т.е. я могу сделать, чтобы Человек Просмотрел, который имеет методы для, Создают, Представление, Удаляют, редактируют человека
большое спасибо
кости
Действительно ли здесь необходимо использовать трехбуквенное сокращение? если необходимо:
psuedocode:
Person // model
update();
View
modelUpdated()
println(Person.name); ...
Controller
main()
while( input = getInput() )
person.update(...);
view.modelUpdated();
define an abstract yet simple MVC program as:
interface Model {
public void setName(String name);
}
interface View {
public String prompt(String prompt);
}
class Controller {
private final Model model;
private final View view;
public Controller(Model model, View view) {
this.model = model;
this.view = view;
}
public void run() {
String name;
while ((name = view.prompt("\nmvc demo> ")) != null) {
model.setName(name);
}
}
}
then use the Observer pattern (built-in since JDK 1.0, see here) in order to fill the concrete classes:
class Person extends Observable implements Model {
private String name;
public Person() {
}
public String getName() {
return name;
}
public void setName(String newName) {
this.name = newName;
setChanged();
notifyObservers(newName);
}
}
class TUI implements Observer, View { // textual UI
private final BufferedReader br;
public TUI(Reader reader) {
this.br = new BufferedReader(reader);
}
public void update(Observable o, Object arg) {
System.out.println("\n => person updated to " + arg);
}
public String prompt(String prompt) {
try {
System.out.print(prompt);
return br.readLine();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
The main class, that is only responsible to build and connect together the components:
TUI view = new TUI(new StringReader("David\nDamian\nBob\n"));
Person model = new Person();
model.addObserver(view);
Controller controller = new Controller(model, view);
controller.run();
the ouput of this program is:
mvc demo> => person updated to David mvc demo> => person updated to Damian ...
Я не уверен, как вы перенесли концепцию представления в командную строку, но я постараюсь ответить.
Мой персональный контроллер может передать объект человека в
представление EditPeronDetails
, однако как мое представление редактирует человека, если оно не может получить доступ к своим сеттерам, как я могу редактировать человека?
Нет, контроллер делает. Представление только «захватывает» новые значения и действия и отправляет их контроллеру, который обрабатывает их и обновляет модель.
Также класс представления делает только одно? то есть могу ли я иметь представление человека, в котором есть методы для создания, просмотра, удаления, редактирования человека
Представление может делать несколько вещей. Например, ту же форму можно использовать для создания, чтения и обновления объекта домена (под созданием и редактированием я подразумеваю сбор значений и отправку их контроллеру). На самом деле это очень распространенный образец. Но, как я уже сказал, логику выполняет не представление, а контроллер.
Итак, чтобы ответить на ваш вопрос, я полагаю, мы можем представить себе наличие специальных методов в представлении человека для захвата пользовательского ввода и обработки взаимодействия с контроллером, но не для логики CRUD (мне действительно интересно, как вы справляетесь взаимодействия с пользователем в командной строке, это кажется не очень удобным для приложения CRUD).