首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT MVP架构优势

GWT MVP架构优势
EN

Stack Overflow用户
提问于 2010-10-24 06:26:22
回答 2查看 3.7K关注 0票数 7

我正在学习GWT,我在很多地方读到使用MVP架构最适合开发GWT应用程序

我还读到过使用MVP ARCH.Can进行测试很容易,有人能告诉我为什么使用MVP架构测试很容易吗?

另外,我正在做一个使用MVP的项目,我发现让视图连接到数据库是非常单调乏味的。我的意思是,我必须更新我的presenter,服务,serviceAsync,servicImpl,Facades以便连接到数据库。

那么,谁能为我提供GWT的MVP的本质?我希望有几个例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-24 06:52:03

presenter (包含逻辑)和view ( UI控件周围的哑巴包装器)之间的分离使您可以:

  • 为演示者编写单元测试,无需相应的环境(桌面、浏览器、GWT小部件)即可运行
  • 无需绑定到一组特定的小部件/UI框架

即可重用前端逻辑

后一种用例很少见,因此让我们关注MVP模型对自动化、程序化测试的适用性。对于一个开发团队来说,这通常采取在无头服务器上使用Hudson (或类似的)进行连续构建/测试周期的形式,在这种服务器上,每次运行测试时打开web浏览器、创建控件等是不现实的。

MVP+GWT的典型用法是视图实现由呈现者提供的接口,并且该接口通常是根据其他通用接口定义的。下面是一个非常简单的呈现程序,它在单击按钮时递增一个数字标签-请注意,视图不是直接显示TextBoxButton,而是返回通用的HasTextHasClickHandlers实例:

代码语言:javascript
复制
public class ButtonClickPresenter {
    public interface View {
        HasText currentValue();
        HasClickHandlers incrementButton();
    }

    private final View myView;
    private int currentValue = 0;

    public ButtonClickPresenter(View myView) {
        this.myView = myView;
        this.myView.currentValue().setText("0");

        this.bind(); // for the sake of demonstration
    }

    public void bind() {
        this.myView.incrementButton.addClickHandler(
            @Override
            new ClickHandler() {
                void onClick(ClickEvent event) {
                    currentValue ++;
                    myView.currentValue().setText(
                        Integer.toString(currentValue));
                }
            });
    }
}

“真实”视图返回UI小部件(在本例中是通过UiBinder创建的):

代码语言:javascript
复制
public class ButtonClickView implements ButtonClickPresenter.View {
    // ... skipped UiBinder initialisation ...

    @UiField Label currentValueLabel;
    @UiField Button incrementButton;

    @Override
    public HasText currentValue() {
        return currentValueLabel;
    }

    @Override
    public HasClickHandlers incrementButton() {
        return incrementButton;
    }

    // ... etc ...
}

而单元测试创建了一个虚拟实现(或者使用MockitoEasyMock等)。因此不需要任何UI组件:

代码语言:javascript
复制
public class ButtonClickPresenterTest {
    ButtonClickPresenter presenter;
    ClickHandler currentHandler;
    String currentText;

    @Before
    public void setUp() {
        presenter = new ButtonClickPresenter(
            // dummy view - just stores label text in a String and
            // keeps track of the Presenter's click handler
            new ButtonClickPresenter.View() {
                @Override
                public HasText currentValue() {
                    return new HasText() {
                        @Override public String getText() { return currentText; }
                        @Override public void setText(String text) { currentText = text; }
                    };
                }

                @Override
                public HasClickHandlers incrementButton() {
                    return new HasClickHandlers() {
                        @Override
                        public HandlerRegistration addClickHandler(ClickHandler handler) {
                            currentHandler = handler;
                        }
                    };
                }
            });
    }

    @Test
    public void testIncrement() {
        // initial value
        assertEquals("0", currentText);

        // clicking the button should increment the number
        currentHandler.onClick(null);
        assertEquals("1", currentText);
    }
}

至于你的下一段:你的视图根本不应该连接到数据库!演示者应该通过服务/服务异步(或抽象,如gwt-dispatchgwt-platform)请求数据,然后调用视图上的方法来填充UI。

顺便说一下,如果您正在寻找GWT MVP代码示例,最后两个链接(以及gwt-presenter)是一个很好的开始-与Google GIN相结合,它们提供了将所有这些东西捆绑在一起的框架。

说了这么多,我同意- GWT+MVP+Java的组合可能是很困难的工作,而非常冗长(我很高兴这些天我不需要用它太多)。然而,另一种选择就更没有吸引力了:一个无法测试、无法维护的意大利面球……

票数 23
EN

Stack Overflow用户

发布于 2010-10-26 04:32:28

您可能想看看在这里-> http://uptick.com.au/content/serendipity-working-gwt-platform-and-smartgwt上发布的示例gwt-platform应用程序。

干杯标记

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4006386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档