我正在开展一个项目,我需要调用许多不同的服务,并希望尽可能多地抽象出常见的逻辑。踢球者是我也想要返回自定义对象而不是像json这样的东西。当我设计一种方法时,我找到了一个让我想起战略模式的范例,但我并不认为它适合。我想知道我是如何做到这一点的设计缺陷或危险。
基本上我已经创建了一个抽象类(ServiceCall
),它保存了调用服务的通用逻辑(拥有一个Internet客户端并从所需的服务获得json响应)。这都是使用公共方法call(Map<String, String> params, Map<String, String> headers)
完成的。抽象类还定义了两个抽象方法:createCustomDTO(Map<String, String> params, Map<String, String> headers)
和parseResponseToObject(String json)
。我将在一秒钟内解释这些目的。
将使用扩展ServiceCall
的类创建对不同服务的每次调用,并创建抽象方法的实现。 createCustomDTO
将创建一个自定义对象,其中包含调用服务所需的所有信息(网址和标头)。 parseResponseToObject
将获取json响应并将其转换为我想在稍后的代码中使用的java对象。
这是我所做的简单实现
ServiceCall
public abstract class ServiceCall {
protected abstract Object parseResponseToObject(String json);
protected abstract CustomServiceDTO createDTO(Map<String, String> keys,
Map<String, String> headers);
public Object call(Map<String, String> params, Map<String, String> headers) {
// create and configure a CustomServiceDTO to call services with
CustomServiceDTO dto = createDTO(params, headers);
try {
// make the service request
String json = getServiceResponse(dto);
catch (Exception e) {
return new CustomServiceError(e);
}
// parse the response into the desired java object
Object response = parseResponseToObject(json);
return response;
}
private String getServiceResponse(CustomServiceDTO dto) {
// use common logic to call the service using the information provided
// by the dto
String dummyResponse = "{\"prop\":\"value\"}";
return dummyResponse;
}
}
SampleImplementation
public class AddressCall extends ServiceCall {
@Override
protected Object parseResponseToObject(String json) {
return new Address(json);
}
@Override
protected CustomServiceDTO createDTO(Map<String, String> keys,
Map<String, String> headers) {
CustomServiceDTO dto = new CustomServiceDTO();
dto.setUrl("www.getMyDummyAddress.com/" + keys.get(0) + "=" + keys.get(1));
dto.setHeaders(headers);
return dto;
}
}
我看到的主要缺点是,永远不要直接调用createCustomDTO
和parseResponseToObject
有点奇怪。
对我来说,主要的优点是易于使用并将我的响应作为java对象返回。
我真正想知道的是这个范例还有其他问题或弊端吗?它在代码中非常好用,但我承认它与java通常使用的方式有点不同。