我试图了解有关活动和地点的 gwt 示例如何工作(https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces)。我想知道他们为什么要为演示者定义一个界面。我知道视图界面有助于轻松交换视图。但是演示者界面有什么用呢?
4 回答
MVP 架构中使您的设计非常干净的另一个关键因素是定义一个Presenter interface
(正如我们已经知道的界面之美OOP concept
)JAVA
。
Presenter
允许我们View
在收到事件时callback
进入的接口。presenter
Presenter 接口定义了以下内容:
public interface Presenter<T> {
void onAddButtonClicked();
}
然后您可以将演示者设置为您的视图,如下所示
private Presenter<T> presenter;
public void setPresenter(Presenter<T> presenter) {
this.presenter = presenter;
}
最后,当您的 PresenterConcreteClass 实现您的presenter
接口时,这些implementations
将触发。
使用接口而不是具体类来设计应用程序始终是最佳实践。
- 参考 - “程序到接口,而不是实现”是什么意思?
- 参考 - MVP 的 WikiPedia 示例
除了使用界面的简洁性之外,您也没有理由不测试您的视图。您可以使用端到端测试,但您也可以简单地使用GWTTestCase
实例化视图并使用模拟演示者。
然后,您可以测试“当我单击此按钮时,它应该从演示者调用此方法,并将值 X、Y 和 Z 作为参数”,或者“当我使用这些参数调用视图的此方法时,那么这样的小部件应该变成红色,而另一个小部件应该隐藏/折叠/显示/无论如何”。
我也曾经用它来类似地构建一个简单的测试平台应用程序,以使用假数据手动测试 UI。该应用程序由按钮组成,用于模拟演示者使用假数据调用视图,并使用Window.alert
或类似的东西处理从视图中返回的演示者回调。您将在浏览器中启动应用程序并单击此处和此处并验证视图是否按预期工作。
当您稍后将字段添加到表单中时,这可能很有用,以确保您正确地将其与演示者关联。当单元测试就足够时,您不想从真正的演示者那里设置您的 GWT-RPC/RequestFactory/任何服务。
我脑海中浮现的 2 个重要原因(可能还有其他原因……)
- 测试:您的 Presenter 不必直接引用 View,这很好,因为 View 包含不能在标准单元测试用例中使用的 GWT 对象(即:任何小部件):任何 GWT 对象都必须有一个 JS要实例化的容器(即:浏览器或 GWTTestCase);JUnit 测试用例不能使用浏览器;GWTTestCase 运行非常缓慢,所以你不应该使用它。如果没有接口,Presenter 将不得不通过直接引用 View 来引用 View 的方法;这意味着在测试 Presenter 时,您必须实例化 View,它必须实例化其 Widget(此时需要 GWTTestCase 用于 Widget)。而你首先要做的就是测试逻辑,这应该完全在 Presenter 中以避免 GWTTestCase ......使用 Display 接口,你可以做到这一点:专注于测试 Presenter,没有实例化 View 的复杂性(它有自己的实例化复杂程度)并且必须使用 GWTTestCase
- 对同一个演示者有多个视图:[我认为只有在您有不同的平台(即:移动应用程序与浏览器)时,您才会这样做,每个平台都需要自己的视图(因为视图的移动应用程序版本的呈现方式与浏览器视图,因为它们是具有不同 GUI 实体的不同平台)]。然后,多个视图都将以各自的方式实现 Display 接口。然后单个 Presenter 可以包含对所有 View 相同的逻辑,用于所有不同的 View,并且所有 View 实现都保证遵循该单个 Presenter 的相同期望(这是 Display 接口中的编码)!这是使用接口设计的 OOP 最佳实践的体现,@SSR Answers。