Sudo战略模式的缺点

时间:2016-03-09 22:05:46

标签: java design-patterns

我正在开展一个项目,我需要调用许多不同的服务,并希望尽可能多地抽象出常见的逻辑。踢球者是我也想要返回自定义对象而不是像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;
    }
}

我看到的主要缺点是,永远不要直接调用createCustomDTOparseResponseToObject有点奇怪。

对我来说,主要的优点是易于使用并将我的响应作为java对象返回。

我真正想知道的是这个范例还有其他问题或弊端吗?它在代码中非常好用,但我承认它与java通常使用的方式有点不同。

1 个答案:

答案 0 :(得分:2)

这与通常使用Java的方式没有什么不同,这称为Template Method设计模式。

它非常常见,除了使用Object,它更好地被泛型类型所取代。