【发布时间】:2012-09-09 21:18:44
【问题描述】:
据我所知,在 MVC 的标准实现中,我们将控制器和模型传递给视图
但我有点不同意这个想法。我不希望我的视图同时了解控制器和模型(哦不。也许有时视图需要模型,但我确信他可以在不了解控制器的情况下生活)
我认为Controller应该管理View和Model,而Model不需要知道Controller和View;视图不需要知道控制器(我不排除模型,因为视图的某些实现需要知道模型才能监听模型的变化)。所以我的想法是视图不需要了解控制器。
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 的新书后,说我们需要将控制器传递给视图,我有点困惑。
你能帮我理解为什么我错了并给我看一些例子吗?
【问题讨论】:
-
我相信控制器和视图不会直接交互。他们通过模型进行交互。所以模型知道控制器和视图,但视图和控制器不知道对方。
-
说了这么多。 MVC 有许多变体,在实践中的实际实现是不同的。
-
你是对的..,你认为在这个例子中,哪个实现更好?
-
我更喜欢第二种实现,但您的视图只是一个按钮,因此它不是代表按钮任何东西的模型。这就是为什么它不需要知道它的模型。但是,如果您的视图是一个表格,那么您的视图必须知道它的数据模型。
-
另外,你不需要Command接口。在 Java swing 中有一个标准的概念,它叫做 ActionListener。这正是您尝试做的。
标签: java model-view-controller view model controller