MVC - мне нужно использовать контроллер в представлении?
Как я знаю, в стандартной реализации MVC мы передаем контроллер и модель в представление
Но я немного не согласен с этой идеей. Я не хочу, чтобы мой взгляд знал как о контроллере, так и о модели (о нет. Может быть, иногда для просмотра требуется модель, но я уверен, что он может жить без знания контроллера)
По моему мнению, контроллер должен управлять представлением и моделью, а модели не нужно знать о контроллере и представлении; view не должен знать контроллер (я не исключаю модель, потому что некоторые реализации представлений должны знать о модели, чтобы прослушивать изменения в модели). Так что моя идея в том, чтоview doesnt need to know about controller.
1. Вот один пример:
public class MyView implements ButtonClickListener {
private Controller myController;
private Button myButton;
// I commented out the model because we dont need it now
// we are talking about using controller in the view
public MyView(Controller c/*, Model m*/) {
myController = c;
myButton = new Button(); // lets say that it is "register" button
myButton.setOnButtonClickListener(this);
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
@Override
public void onClick() {
myController.tellToModelToDoSomething();
}
}
И контроллер:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView(this);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
}
2. А теперь, как я вижу эту реализацию без прохождения контроллера:
Мой взгляд:
public class MyView {
private Button myButton;
public MyView() {
myButton = new Button();
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
public void setOnRegisterButtonClick(final Command command) {
myButton.setOnButtonClickListener(new ButtonClickListener() {
@Override
public void onClick() {
command.execute();
}
});
}
}
& Quot; Команда & Quot; интерфейс:
public interface Command {
void execute(/*also can handle extra params*/);
}
И контроллер:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView();
view.setOnRegisterButtonClick(command);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
private Command command = new Command() {
public void execute() {
tellToModelToDoSomething();
}
};
}
Так почему я думаю, что с помощью контроллера в представленииIS NOT GOOD:
Мы смешиваем контроллер и видим реализации, создавая новые зависимости.
Также я думаю, что View должен содержать только VIEWS и операции с ними (и использование контроллера и некоторых его методов уже выглядит как логика).
В первом примере представление сообщает контроллеру, что делать. Ты согласен? Похоже, вид контролирует контроллер!
Во втором примере контроллер контролирует, что делать, и просто говорит представлению, что делать, если нажата какая-то кнопка (только вид знает, какая кнопка будет)
Я всегда использовал вторую схему, но после прочтения новой книги о mvc, в которой говорится, что мы должны передать контроллер представлению, я немного запутался.
Не могли бы вы помочь мне понять, почему я не прав, и показать мне несколько примеров?