【发布时间】:2015-01-28 19:36:46
【问题描述】:
我一直将 MVC 理解为模型不应该对视图一无所知,反之亦然。然而,在我的大学课程中,使用 MVC 模式的视图示例如下:
class View implements Updatable {
private final JButton button = new JButton("Press Me!");
private final JTextField textField = new JTextField(10);
//some setup of the button and textfield
public void update(Model model) {
if (model.morePressesAllowed()) {
textField.setText(String.valueOf(model.count()));
} else {
textField.setText("Too Many!");
button.setEnabled(false);
}
}
}
视图必须知道模型具有哪些方法,这对我来说似乎很奇怪。就 MVC 模式而言,将按钮和文本字段暴露给控制器并在控制器上有更新方法似乎会更好?
模型只是增加一个数字,如果它达到 5,那么 morePressesAllowed 返回 false。
模型还有一个可更新的列表,当计数器发生变化时,它会循环通过可更新并调用更新,虽然这比有一个列表视图要好,但似乎控制器应该负责告诉视图何时模型改变了吗?
编辑:模型是:
class Model {
private final List<Updatable> views = new ArrayList<Updatable>();
private int count;
private boolean morePressesAllowed = true;
public void addObserver(Updatable observer) {
views.add(observer);
}
public void increment() {
count++;
if (count >= 5) {
morePressesAllowed = false;
}
notifyObservers();
}
private void notifyObservers() {
for (Updatable view : views) {
view.update(this);
}
}
}
Controller/Main 类:(控制器也不应该创建模型和视图并且是普通的公共类吗?)
public class GuiApp {
private View view = new View(new Controller());
private Model pressCounter = new Model();
class Controller implements ActionListener {
public void actionPerformed(ActionEvent actionEvent) {
pressCounter.increment();
}
}
GuiApp() {
pressCounter.addObserver(view);
}
}
实际上我更喜欢这样的东西:http://www.tutorialspoint.com/design_pattern/mvc_pattern.htm 因为控制器只是包装了视图和模型的一堆方法,虽然看起来更像 MVC,但模型和视图却没有彼此了解什么,只是看起来效率低下而且更复杂?
【问题讨论】:
-
你也可以展示一下模型吗?
标签: java model-view-controller