- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试学习 MVP,但有些事情让我望而却步;如果Presenter使用view作为界面,那么View就不能只是控件的简单渲染。想象一下尝试编写一个打字练习游戏,其中单词会随机生成到 UI 中,用户必须在单词从屏幕上掉下来时键入它们。
因此 View 将具有如下方法:
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 实现已经有了逻辑。它正在维护其 WordComponent
的 Map
。我在这里有两个自己的类,WordLayout implements LayoutManager2
和 WordComponent extends JLabel
(或其他东西,但那会是更多代码)。
理论上,演示者应该对 Swing 一无所知,因此我可以使用模拟进行单元测试,该模拟可能会记录到控制台或其他内容。但简单地管理 Swing 对象本身就是一项工作。或者,如果我想将此应用程序转换为 Tomcat 网页怎么办?现在 ServletView
类正在管理移动文字的 AJAX 调用。它依赖于 AJAX 框架,将更多工作卸载到 View
。
总结:View
实现是否应该具有管理其自身组件的“逻辑”?
跟进:我上面写的代码可能甚至不会响应,因为 Model
和 Presenter
没有在 Event Dispatch 线程上工作(或者,他们是,这可能更糟)。向 Event Dispatch 线程传递显示更新的代码去了哪里?或者,Presenter
应该在 Event Dispatch 线程上吗?
编辑:我刚刚想到一个主意。拥有一个特定于平台的子演示者,该子演示者了解实现细节,例如您使用的是 Swing 还是其他东西。
Edit2: 还有一个问题,基于@DuncanJones 的回答。想象一下,我想添加逻辑以使游戏可调整大小并根据新大小缩放所有内容的大小。该逻辑是在 View
中还是在 Presenter
中?
最佳答案
View 组件必须包含足够的逻辑来向用户显示界面。根据所使用的框架, View 中可能有相当多的代码。重要的是确保业务逻辑位于 Presenter 中。
关于您的辅助查询,当 View 调用它们时(在 Swing 的情况下),将在 EDT 上调用所有 Presenter 方法。除非 Presenter 要求的操作微不足道,否则我会立即启动后台线程来完成工作。该线程将在使用 SwingUtilities.invokeLater()
完成后更新 View 。
事实上,为了避免绑定(bind)到 Swing,我倾向于将我自己的 EventDispatcher
类传递给每个 Presenter。这是一个与 SwingUtilities
具有相同方法的接口(interface)。如果需要,我可以在不同的类(class)代替。
旁注:这会使使用 JUnit 对 Presenter 进行单元测试变得困难,因为 Presenter 方法(和单元测试)将在后台线程完成之前完成。我倾向于使用负责运行后台线程的 Executor
构造每个 Presenter。然后,在单元测试环境中,我传入一个特殊的 Executor
实现,它立即在同一线程上执行 run()
方法。这确保了单元测试是单线程的。示例:
public class SingleThreadExecutor implements Executor {
@Override
public void execute(Runnable command) {
command.run();
}
}
关于java - MVP Views 到底有多蠢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17836421/
我在尝试从子文件夹调用 View 时遇到一些错误。首先,这东西能用 Route::get('/', function() { return View::make('sample'); }); 但是当我
我有另一个 View 设置,并准备好等待其viewmodel。我的RelayCommand到达我的“当前” View 模型。从当前的 View 模型显示新 View 的最佳方法是什么? 我一直在阅读,
我有一个 bigquery View ,我想与数据分析师共享,以便他们可以通过 Data Studio 访问其数据。此共享 View 对另一个数据集中的私有(private) View 进行查询,而私
我有 3 个 View ,并希望将它们集成到一个 View 中,以便它们成为这一 View 中的子文件夹。 我怎样才能做到这一点?还是我必须制作一个 View ,然后再次手动添加和配置这些 View
我在沙发数据库中有一些文档,这些文档的字段是不同关联文档的ID数组: { associatedAssets: ["4c67f6241f4a0efb7dc2abc24a004dfe", "270f
我正在开发一个小实用程序 View ,它将嵌入到我们的几个应用程序中。它将位于一个公共(public)图书馆中。 我应该将其作为 ViewModel 以及默认的 View 实现公开,还是作为具有固定
由于我的某些 View 具有相似的功能,因此我希望能够与每个 View 共享相同的 View 模型。我的想法是将 token 传递给viewmodel的构造函数,但这将导致代码中出现许多if和else
我有一个目标 View (蓝色 View 和红色 View 用于左上角位置)。我试图用手指移动这个 View 。如果 View 不旋转,一切都很好。 但当我旋转 View 并移动时,第一次就很好了。但
我收到这个错误, "Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' on a
我将发布我目前拥有的源代码,然后解释我的问题。 这是我希望过渡发生的窗口 这是关联的 View 模型 public class MainViewModel {
我正在尝试找出我遇到的错误。最初,我的同事只是使用 将 View 添加到 subview 中 [self.view addSubview:someController.view]; 来自当前ViewC
我是 MVVM 的新手,需要一些帮助。 我的应用程序由许多不同的窗口组成,这些窗口显示允许用户编辑业务层中的数据的控件。 目前,每次用户打开这些窗口之一的新实例时,都会从头开始创建一个 ViewMod
我一直在寻找与我类似的问题以找到解决方案,但我真的找不到类似的东西。 我试图使用 asynctask 类从解析中下载帖子数组,在获取帖子后,它应该在我的页面中设置帖子数组,并执行 setAdapter
这个问题在这里已经有了答案: What is local/remote and no-interface view in EJB? (2 个答案) 关闭 9 年前。 我以前理解它的意思是“接口(in
希望这不会太困惑。 我有一个主视图 Controller ( MainView ),在 View 底部有一个堆栈 View ,在堆栈 View 中我有三个 View 。在一个 View 中(我们称之为
我一直在想这个问题,我真的不知道如何正确地将一个 View Controller 管理的 View 添加到另一个 View Controller 的 View 中。 这不起作用,因为 View 没有完
在明显的情况下,我必须将大量文件从一个 View 复制到另一个 View 。要复制的文件名将作为输入给出。有什么想法可以通过脚本实现吗? 谢谢,日语 最佳答案 最简单的方法是使用 clearfsimp
我正在使用完整日历。这里我的问题是,当单击上一个按钮或下一个按钮单击功能时,如何找到月 View 、周 View 或日 View 格式的完整日历。这里正在调用下一个和上一个按钮的自定义代码。因为使用这
我对这两者感到困惑,并试图找出差异,但没有得到我正在寻找的特定内容。 在哪里使用索引 View 而不是普通 View 。 它们之间的一些重要区别。 最佳答案 关键的区别在于物化 View 很好,物化了
我在一个 xib 中有一个 CustomView,在两个不同的 xib 中有两个不同的 View 。我想在一个 CustomeView 中依次显示这两个 View 。我有一个 NSView 对象,它连
我是一名优秀的程序员,十分优秀!