如何在GWT中使用命令模式?

时间:2014-02-11 10:26:59

标签: java gwt command-pattern

我一直在观察video在GWT中实现命令模式,但我可以帮助理解它。具体来说,该视频讨论了命令模式如何用于缓存/生成批量请求,实现撤消功能等。但我只是没有看到它与使用常规GWT-RPC请求有何不同。

在视频中,他希望实施一项服务,该服务将通过ArrayList<ContactId>发送并返回ArrayList<Contact>地址簿。以下是他的表现:

1)定义两个接口ActionResponse,如下所示:

interface Response { }

interface Action <T extends Response> { }

2)创建以下RPC服务以获取联系人详细信息:

interface ContactsService extends RemoteService
{
    <T extends Response> T execute( Action<T> action );
}

interface ContactsServiceAsync
{
  <T extends Response> void execute( Action<T> action, 
                                    AsyncCallback<T> callback);
}

3)创建以下Action类:

class GetContacts implements Action<GetContactsResponse>
{
   public ArrayList<ContactId> getContactIds(){...}
}

4)以下Response课程:

class GetContactsResponse implements Response
{
    public ArrayList<Contact> getContacts() {...}
}

5)为了执行它,他执行以下操作:

service.execute( new GetContacts(), new AsyncCallback...);

我的问题是,如何帮助缓存请求,批量处理或实现撤消功能?

如果有人能为我解释,那就太好了..

2 个答案:

答案 0 :(得分:1)

您所做的是统一您的RPC调用。这种统一使您能够稍后为所有RPC调用添加一些通用代码。此通用代码(调度程序)将负责:

  • 批量处理请求
  • 缓存请求

您可以在this blog post中看到调度程序代码的示例。

Here you can find a library出于同样的目的。

答案 1 :(得分:1)

如果您最后一步中的service实例仅仅是GWT.create(ContactsService.class)的结果,则无效。但是您可以自己(或通过生成器)实现ContactsServiceImpl包装真正的 RPC实现并添加缓存和批处理。有关缓存的示例,请参阅视频中20:30左右的slide 46。批处理可以是显式的(包含其他命令的命令),也可以是隐式的(隐藏在服务包装器实现中,由scheduleFinally触发,或者在一小段延迟后触发)

重新。撤消,因为所有参数(可以说是单个参数)捆绑在一个请求对象中,您可以按原样将其传递给undo()方法(而不是service())。当然,实现撤消功能比发送命令要多得多,但至少你不必为每个可以取消的动作实现撤销方法。