正如我所知,在 MVC 的标准实现中,我们将 Controller 和 Model 传递给 View
但我有点不同意这个想法。我不希望我的视图同时了解控制器和模型(哦不。也许有时视图需要模型,但我确信他可以在不了解控制器的情况下生活)
我认为Controller应该管理View和Model,而Model不需要知道Controller和View;视图不需要知道控制器(我不排除模型,因为视图的某些实现需要知道模型才能监听模型的变化)。所以我的想法是view 不需要知道 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();
}
});
}
}
“命令”界面:
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();
}
};
}
那么为什么我认为在视图中使用控制器并不好:
我们正在混合控制器和视图实现,建立新的依赖关系。
另外我认为 View 应该只包含 VIEWS 和它们的操作(并且使用控制器和他的一些方法已经看起来像逻辑)。
在第一个示例中,视图告诉控制器该做什么。你同意吗?看起来视图控制控制器!
在第二个示例中,控制器控制要做什么,并告诉视图如果单击某个按钮(只有视图知道它将是什么按钮)要做什么
我总是使用第二种方案,但是在阅读了一本关于 mvc 的新书后,说我们需要将控制器传递给视图,我有点困惑。
你能帮我理解为什么我错了并给我看一些例子吗?