GWT有许多名字相似(看起来目的也相似)的类型:
Widget
(组件)AcceptsOneWidget
(接受一个组件)Composite
(复合组件)IsWidget
(是组件)SimplePanel
(简单面板)
在什么时候/何处使用它们是适当的? 它们与RootPanel
的关系是什么?
让我们先将接口与类分离。
接口非常适用于模拟(mocking)(从而允许在不需要笨重的GWTTestCase
的情况下测试您的应用程序):
IsWidget
:当您只需要一个小部件(widget)的handle,而不依赖于Widget
类时。这通常与MVP一起使用,作为表示view的一种方式。AcceptsOneWidget
:当您需要一个单个小部件(widget)的占位符(以IsWidget
的形式)时。这通常与Activities一起使用,将view(IsWidget
)插入给定的slot(AcceptsOneWidget
)中。您列出的所有类都扩展了Widget
,因此它们依赖于JSNI,(大多数情况下)需要在GWT环境中运行(对于单元测试,这意味着需要一个GWTTestCase
):
Widget
:所有小部件(widget)的基础。实现了IsWidget
,从asWidget()
返回自身。Composite
:当您需要创建一个由其他部件构建而隐藏其实现的小部件时,可以使用此基类。虽然您可以扩展现有的组件,但通常最好将其隐藏在Composite
中,以便仅公开您需要/想要公开的API。 Composite
是关于“组合而不是继承”和封装。标准小部件中复合的示例包括TabPanel
(由TabBar
和DeckPanel
构建)、DateBox
(在PopupPanel
中由TextBox
和DatePicker
构建)、ValueListBox
,它包装了一个ListBox
或ValuePicker
,后者包装了一个CellList
。在许多情况下,鉴于面板接受IsWidget
子元素,您可以简单地实现IsWidget
而不是扩展Composite
,但有时具有真正的小部件很有用。SimplePanel
是一个实现AcceptsOneWidget
的面板,在使用活动时非常有用(但您也可以轻松实现AcceptsOneWidget
以插入任何类型的面板)话虽如此,谷歌最近开源了GWT-Mockito,将Mockito插入到GWT.create()
中,并使用类加载器魔法重写JSNI方法并删除final
修饰符,以便您可以直接在测试中使用小部件,而无需使用GWTTestCase
或MVP。
综上所述,这取决于你如何处理你的代码,如何架构你的应用程序。如果你使用MVP,请在你的presenter中只依赖于接口(例如:IsWidget
、AcceptsOneWidget
),以便在测试中轻松模拟你的视图。
否则,如果你想要一个“简化的MVP”,其中视图是UiBinder模板,请尝试使用GWT-Mockito进行测试并直接使用小部件。
当然,在同一个应用程序中,您可以混合使用两种方法。无论如何,对于低级别的事情(很少需要),请将自己的小部件构建为Widget
,而对于其他所有内容,请使用 Composite
或IsWidget
,而不是扩展现有的小部件。