GWT MVP 的地点和事件 - 模型在哪里?

标签 gwt mvp

我正在努力熟悉 GWT 开发的“场所和事件”设计模式,到目前为止,我认为它有很大的潜力。我特别喜欢这样的方式:一旦您开始从“位置”的角度考虑您的应用程序,浏览器历史记录实际上就在您的腿上,几乎不需要额外的努力。

但是,有一件事让我烦恼:到目前为止我看到的所有文章和代码示例都掩盖了一个(就我而言,主要)方面:“MVP”的“M”部分,即模型!

在正常的 MVP 架构中,据我了解,Presenter 持有对 Model 的引用,并负责根据 UI 事件更新它,或者根据 Model 的更改分别更新 UI。

现在,在“P&A”的所有文章/示例中,事件似乎正在取代演示者,但与“普通”演示者不同,每当新位置到达时,它们就会被丢弃并(重新)创建,因此他们不能存储客户端状态,否则每次都会丢失。事件的创建成本很低,因此并不麻烦,但我不想一遍又一遍地创建复杂应用程序的模型。

所有示例都相当简单,没有太多状态,因此只需忽略模型方面,但实际的复杂应用程序将在哪里存储其状态?

最佳答案

我想我找到了自己的答案。主要问题似乎是所有简单的代码示例都使事件成为演示者,如下所示:

public class NavigationActivity extends AbstractActivity implements NavigationView.Presenter {
    private final ClientFactory clientFactory;
    private final NavigationPlace place;

    public NavigationActivity(ClientFactory clientFactory, NavigationPlace place) {
        this.clientFactory = clientFactory;
        this.place = place;
    }

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus) {
        NavigationView navView = clientFactory.getNavigationView();
        navView.setSearchTerm(place.getSearchTerm());
        navView.setPresenter(this);
        panel.setWidget(navView);
    }

    @Override
    public void goTo(Place place) {
        clientFactory.getPlaceController().goTo(place);
    }
}

现在的 Activity 的生命周期相当短暂,而“经典”意义上的典型 Presenter 的生命周期要长得多,以便维持模型和 UI 之间的绑定(bind)。所以我所做的就是使用标准 MVP 设计模式实现一个单独的 Presenter,所有 Activity 所做的事情都是这样的:

public class NavigationActivity extends AbstractActivity {
    private final ClientFactory clientFactory;
    private final NavigationPlace place;

    public NavigationActivity(ClientFactory clientFactory, NavigationPlace place) {
        this.clientFactory = clientFactory;
        this.place = place;
    }

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus) {
        NavigationPresenter presenter = clientFactory.getNavigationPresenter();
        presenter.setSearchTerm(place.getSearchTerm());
        presenter.go(panel);
    }
}

因此,事件不是获取 View ,并像其上的演示者一样,而是获取实际演示者,只是通知它引起的客户端状态更改由地点,并告诉它在哪里显示其信息(即 View )。然后演示者可以自由地以任何喜欢的方式管理 View 和模型 - 这种方式比我发现的代码示例要好得多(至少对于我正在开发的应用程序来说是这样)远。

关于GWT MVP 的地点和事件 - 模型在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510571/

相关文章:

css - 将 GWT 中的 css(动态地)设置为具有多种关联样式的元素

ajax - Facebook 在分享时用 "_escaped_fragment_"替换 #!v 网址

java - 将 MVP 模式应用于 JDialogs

android - 在 MVP 模式中在哪里进行 HTTP 请求?

c# - 表示层控制修改

design-patterns - 演示模型与被动 View

gwt - 外部 GWT 与 GWT-EXT

java - GWT mvn gwt :debug throws OutOfMemoryError

java - 从已部署的 Web 应用程序获取 Tomcats webapps 目录中文件的相对路径

gwt - UiBinder文件中的自定义标签