我正在尝试学习 MVP,但有些东西让我无法理解;如果 Presenter 使用视图作为界面,那么 View 就不能只是控件的简单渲染。想象一下,尝试编写一个打字练习游戏,其中单词随机生成到 UI 中,用户必须在单词落下时输入。
所以视图将有如下方法:
public interface View {
addWord(String word, double x, double y); // or possibly (Word word)
moveWord(String word, double distance);
removeWord(String word);
setScore(int score);
registerKeyListener(KeyListener listener);
// other stuff
}
但最终 VIEW 将不得不负责创建自定义控件。这里省略了很多代码,但希望这足以说明我的意思。例子:
public class SwingView {
private JPanel thePanel;
private Map<String, WordComponent> currentWords = new HashMap<>();
public SwingView() {
thePanel = new JPanel(new WordLayout());
// other stuff
}
public void addWord(String word, double x, double y) {
WordComponent newWord = new WordComponent(word);
currentWords.put(word, newWord);
Point2D.Double point = new Point2D.Double(x, y);
thePanel.add(newWord, point);
}
public void removeWord(String word) {
WordComponent theWord = currentWords.get(theWord);
thePanel.remove(theWord);
}
}
View 实现已经有逻辑了。它保持着它的Map
一个WordComponent
。我在这里有两个我自己的类WordLayout implements LayoutManager2
,和WordComponent extends JLabel
(或其他东西,但那将是更多的代码)。
从理论上讲,演示者应该对 Swing 一无所知,因此我可以使用可能会记录到控制台或其他东西的模拟进行单元测试。但简单地管理 Swing 对象本身就是一项工作。或者,如果我想将此应用程序转换为 Tomcat 网页怎么办。现在类ServletView
正在管理移动单词的 AJAX 调用。它依赖于 AJAX 框架,将更多工作卸载到View
.
摘要:View
实现是否应该具有管理自己的组件的“逻辑”?
跟进:我上面写的代码可能甚至不会响应,因为Model
和Presenter
不在 Event Dispatch 线程上工作(或者,他们是,这可能更糟)。将显示更新传递给 Event Dispatch 线程的代码在哪里?或者,应该Presenter
在事件调度线程上吗?
编辑:我刚刚想到一个想法。拥有一个特定于平台的子演示者,该子演示者了解实现细节,例如您使用的是 Swing 还是其他东西。
Edit2:还有一个问题,基于@DuncanJones 的回答。想象一下,我想加入逻辑以使游戏可调整大小并根据新大小调整所有内容的大小。该逻辑会在 中View
,还是在 中Presenter
?