MVC в командной строке
Я смотрю в MVC с точки зрения командной строки (не веб и не фреймворк).. просто и мило. единственное, что меня смущает-это вид из окна? (ну, это может быть не единственный, но его главный)
на сайте IBM представление имеет следующее определение
представление дает презентация модели. Это посмотрите приложение. Вид может доступ к модели getters, но он имеет никаких знаний о сеттерах. В кроме того, он ничего не знает о контроллер. Вид должен быть уведомление об изменениях в модели происходить.
Итак, если у меня есть следующее:
модель
- человек
посмотреть
- EditPersonDetails
контроллер
- классе personcontroller
мой контроллер person может передать объект person в представление EditPeronDetails, однако как мой взгляд редактирует человека, если он не может получить доступ к своим сеттерам, как я могу редактировать человека?
также класс view делает только одну вещь? ie может ли у меня быть вид человека, который имеет методы для создания, просмотра, удаления, редактирования человека
большое спасибо
кости
4 ответов
неужели надо применить 3 буквы аббревиатуры здесь? если нужно:
- пользователь видит экран консоли, на котором отображается посмотреть (строки из текста)
- пользователь вводит что-то в командной строке, которая является даже С посмотреть
- контроллер получает событие, т. е. пользовательский ввод
- контроллер делает что-то соответственно, и обновления модель (лица)
определите абстрактную, но простую программу MVC как:
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);
}
}
}
затем использовать шаблон Observer (встроенный начиная с JDK 1.0,посмотреть здесь) для того, чтобы заполнить конкретными классами:
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);
}
}
}
основной класс, то есть только ответственность строить и соединять компоненты:
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();
выход этой программы:
mvc demo> => person updated to David mvc demo> => person updated to Damian ...
Я не уверен, что понимаю, как Вы перенесли концепцию представления в командной строке, но я попытаюсь ответить.
мой контроллер person может передать объект person в
EditPeronDetails
view, однако как мой вид редактирует человека, если он не может получить доступ к своим сеттерам, как я могу редактировать человека?
это не так, контроллер делает. Представление только "захватывает" новые значения и действия и отправляет их контроллеру, который обрабатывает их и обновляет модель.
также класс view делает только одну вещь? ie может ли у меня быть вид человека, который имеет методы для создания, просмотра, удаления, редактирования человека
представление может делать несколько вещей. Например, та же форма может использоваться для создания, чтения и обновления объекта домена (под созданием и редактированием я имею в виду захват значений и отправку их контроллеру). На самом деле это очень распространенная модель. Но, как я уже сказал, это не представление, которое выполняет логику, это контроллер, который делает.
Итак, чтобы ответить на ваш вопрос, я думаю, мы можем представить, что выделенные методы в представлении Person захватывают пользовательский ввод и обрабатывают связь с контроллером, но не для логики CRUD (мне действительно интересно, как вы обрабатываете взаимодействия с пользователем в командной строке, это не кажется очень удобным для приложения CRUD).
Я работаю над перепроектированием тривиальной программы CLI и задал себе аналогичный вопрос.
исследуя это, очевидно, что MVC и его производные обычно используются неправильно. Чтобы еще больше усложнить ситуацию, существуют варианты MVC (Web MVC), которые не придерживаются почти оригинальной реализации Smalltalk-80 и определения MVC.
что сказал, мне нравится ответ dfa С одним предостережением: входной сигнал потребителя должен быть помещен внутри контроллер, а не вид. Его ответ совпадает с Дельфин Smalltalk MVP шаблон по сравнению с MVC.
" Контроллер-это компонент, который реагирует на пользовательский ввод, такой как ввод данных и команды, вводимые с клавиатуры или мышкой. Его обязанность-действовать как мост между человеком и приложением, позволяя пользователю взаимодействовать с экраном и данными."- источник
как таковой, Я бы удалил:
return br.readLine();
из представления и просто дождитесь ввода контроллера следующим образом:
public void run() {
view.prompt("\nmvc demo> ");
String name = br.readLine(); // assume the BufferedReader object is now in the controller
model.setName(name);
}
честно говоря, мне трудно оправдать это как обязательно лучше, но я думал, что выброшу там.