GWT:AcceptsOneWidget vs Composite vs IsWidget

8 java mvp gwt

GWT有很多类似名称(和看似相似的)类型:

  • Widget
  • AcceptsOneWidget
  • Composite
  • IsWidget
  • SimplePanel

何时/何地适合使用这些?他们与谁的关系是RootPanel什么?

Tho*_*yer 11

让我们首先从类中分离接口.

接口非常适合模拟(因此允许在不需要缓慢的情况下测试您的应用程序GWTTestCase):

  • IsWidget:当你需要的只是一个小部件的句柄,而不依赖于Widget类.这通常与MVP一起用作表示视图的方式.
  • AcceptsOneWidget:当您需要单个窗口小部件的占位符时(以a的形式IsWidget).这通常与Activities一起使用,以将view(IsWidget)插入到给定的(AcceptsOneWidget)中.

您列出的类都扩展Widget,因此它们依赖于JSNI并且(大多数时候)需要在GWT环境中运行(对于单元测试,这意味着a GWTTestCase):

  • Widget:所有小部件的基础.实现IsWidget从中返回asWidget().
  • Composite:当您需要创建从其他窗口小部件构建的窗口小部件时隐藏其实现的基类.虽然您可以扩展现有的小部件,但通常最好将其隐藏在内部,Composite这样您只需公开您需要/想要公开的API.Composite是关于"组成而不是继承"和封装.标准小部件中的复合材料的示例包括TabPanel(由a TabBar和a构建DeckPanel),DateBox(由a TextBoxDatePickera 构建PopupPanel),ValueListBox包装ListBoxValuePicker包装a CellList.在许多情况下,假设小组接受IsWidget孩子,你可以简单地实现IsWidget相当扩展Composite,但有时候有一个真实的 Widget.
  • SimplePanel实现的面板,在使用活动时AcceptsOneWidget可用作插槽(但您也可以轻松实现AcceptsOneWidget插入任何类型的面板)

话虽这么说,Google最近开源的GWT-Mockito将Mockito插入GWT.create()并使用类加载器魔术来重写JSNI方法并删除final修饰符,这样您就可以直接在测试中使用小部件而无需GWTTestCaseMVP.

总而言之,这取决于您如何处理代码,以及如何构建应用程序.如果您使用MVP,请仅依靠演示者中的接口(IsWidget,AcceptsOneWidget),以便在测试中轻松模拟视图. 否则,或者如果您想要一个视图是UiBinder模板的"简化MVP",请尝试GWT-Mockito进行测试并直接使用小部件. 当然,您可以在同一个应用程序中混合使用这两种方法.在任何情况下,构建自己的小部件作为低级别事物(很少需要),s或s用于其他所有内容,而不是扩展现有小部件.

WidgetCompositeIsWidget