我一直在观察video在GWT中实现命令模式,但我可以帮助理解它。具体来说,该视频讨论了命令模式如何用于缓存/生成批量请求,实现撤消功能等。但我只是没有看到它与使用常规GWT-RPC请求有何不同。
在视频中,他希望实施一项服务,该服务将通过ArrayList<ContactId>
发送并返回ArrayList<Contact>
地址簿。以下是他的表现:
1)定义两个接口Action
和Response
,如下所示:
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...);
我的问题是,如何帮助缓存请求,批量处理或实现撤消功能?
如果有人能为我解释,那就太好了..
答案 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()
)。当然,实现撤消功能比发送命令要多得多,但至少你不必为每个可以取消的动作实现撤销方法。