GWT 有许多类似名称(并且看似用途相似)的类型:
Widget
AcceptsOneWidget
Composite
IsWidget
SimplePanel
何时/何地适合使用这些?他们与 的关系是RootPanel
什么?
让我们首先将接口与类分开。
接口非常适合模拟(因此可以在不需要 sluggish 的情况下测试您的应用程序GWTTestCase
):
IsWidget
:当您只需要一个小部件的句柄时,不依赖于Widget
类。这通常与 MVP 一起用作表示视图的一种方式。AcceptsOneWidget
:当您需要单个小部件的占位符时(以 的形式IsWidget
)。这通常与活动一起使用,以将视图( IsWidget
) 插入给定的插槽( AcceptsOneWidget
)。您列出的所有类都 extend Widget
,因此它们依赖于 JSNI 并且(大多数情况下)需要在GWT 环境中运行(对于单元测试,这意味着 a GWTTestCase
):
Widget
:所有小部件的基础。实现IsWidget
从asWidget()
.Composite
:当您需要创建从其他小部件构建的小部件同时隐藏它们的实现时的基类。虽然您可以扩展现有小部件,但通常最好将其隐藏在 a 中Composite
,这样您就只公开您需要/想要公开的 API。Composite
是关于“组合而不是继承”和封装。标准小部件中的复合示例包括TabPanel
(由 aTabBar
和构建DeckPanel
)、DateBox
(由 aTextBox
和DatePicker
a构建PopupPanel
)、ValueListBox
包装 aListBox
或ValuePicker
包装 a CellList
。在许多情况下,考虑到面板接受IsWidget
子面板,您可以简单地实现IsWidget
相当 extend Composite
,但有时拥有一个true Widget
很有用。SimplePanel
实现的面板,在使用活动时AcceptsOneWidget
用作插槽(但您也可以轻松实现AcceptsOneWidget
以插入任何类型的面板)话虽如此,谷歌最近开源了GWT-Mockito,它将 Mockito 插入GWT.create()
并使用类加载器魔法来重写 JSNI 方法并删除final
修饰符,因此您可以直接在测试中使用小部件而无需GWTTestCase
MVP。
所以,总而言之,这取决于你如何处理你的代码,你如何构建你的应用程序。如果您使用 MVP,请坚持仅依赖于您的PresenterIsWidget
中的接口 ( , AcceptsOneWidget
),以便您可以轻松地在测试中模拟您的视图。
否则,或者如果您想要一个视图是 UiBinder 模板的“简化 MVP”,请尝试 GWT-Mockito 进行测试并直接使用小部件。
当然,您可以在同一个应用程序中混合使用这两种方法。在任何情况下,将您自己的小部件构建为s 用于低级事物(很少需要),并将s 或s 用于其他一切,而不是扩展现有的小部件。Widget
Composite
IsWidget
你把一切都搞混了。
小部件:它允许您与用户进行交互。(例如按钮)
面板:这些是可以包含其他面板/小部件的小部件。可以称为小部件的容器。
AcceptsOneWidget:由仅接受一个小部件的面板实现。(例如SimplePanel)
Composite:一种可以包装另一个小部件的小部件,隐藏被包装的小部件的方法。复合对于从包含在单个面板中的多个其他小部件的聚合中创建单个小部件很有用。
IsWidget:几乎所有已知小部件都实现的接口。它提供对该小部件的访问。
SimplePanel:仅包含一个小部件的面板。
RootPanel:是添加所有其他面板的基本面板。