ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – MVP视图真的如此愚蠢?

2019-06-24 23:59:29  阅读:135  来源: 互联网

标签:java mvp swing


我正在努力学习MVP,但有些事情让我望而却步;如果Presenter将视图用作界面,那么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实现已经有了逻辑.它正在维护WordComponents的Map.我在这里有两个类,WordLayout实现了LayoutManager2,而WordComponent扩展了JLabel(或其他东西,但这甚至是更多的代码).

从理论上讲,演示者应该对Swing一无所知,所以我可以使用可能会记录到控制台或其他东西的模拟器进行单元测试.但是简单地管理Swing对象本身就是一项工作.或者,如果我想将此应用程序转换为Tomcat网页,该怎么办?现在类ServletView正在管理移动单词的AJAX调用.哪个依赖于AJAX框架,这更多的工作卸载到View.

简介:View实现是否应该具有管理自己组件的“逻辑”?

后续:我上面写的代码可能甚至不会响应,因为Model和Presenter没有处理Event Dispatch线程(或者,它们可能更糟).交出显示事件调度线程更新的代码在哪里?或者,Presenter是否应该在Event Dispatch线程上?

编辑:我刚想到一个想法.拥有一个特定于平台的子演示者,该子演示者了解实现细节,例如您是使用Swing还是其他东西.

编辑2:还有一个问题,基于@DuncanJones的回答.想象一下,我想把逻辑放在一起,让游戏可以调整大小,并根据新的大小调整一切的大小.这个逻辑会在视图中还是在演示者中?

解决方法:

View组件必须包含足够的逻辑来显示用户的界面.根据所使用的框架,View中可能会有相当多的代码.重要的是确保业务逻辑位于Presenter中.

关于您的辅助查询,当View调用它们时(在Swing的情况下),将在EDT上调用所有Presenter方法.除非Presenter所要求的操作微不足道,否则我会立即启动后台线程来完成工作.该线程将在使用SwingUtilities.invokeLater()完成时更新View.

事实上,为了避免与Swing绑定,我倾向于将自己的EventDispatcher类传递给每个Presenter.这是一个与SwingUtilities具有相同方法的接口.如有必要,我可以在另一个班级替换.

旁注:这可以使用JUnit对Presenter进行单元测试很困难,因为Presenter方法(和单元测试)将在后台线程之前完成.我倾向于使用负责运行后台线程的Executor构造每个Presenter.然后,在单元测试环境中,我传入一个特殊的Executor实现,该实现立即在同一个线程上执行run()方法.这可确保单元测试是单线程的.例:

public class SingleThreadExecutor implements Executor {
  @Override
  public void execute(Runnable command) {
    command.run();
  }
}

标签:java,mvp,swing
来源: https://codeday.me/bug/20190624/1283225.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有