集中调用逻辑但抽象返回类型

时间:2013-08-30 18:36:12

标签: java design-patterns

我不确定我想要做的事情是不可能的,或者也许是在长周末之前的星期五,我的大脑已经检查过了。我尝试了几种方法但似乎没有什么能让我得到我想要的东西。

背景

我编写了一个小的包装器框架,它使用Apache HTTP Commons lib将我的门户应用程序与外部REST API连接起来。我创建了一个如下所示的层次结构(对于请求和响应 - 客户端是我在这里用来抽象我的实际最终客户端的术语)。

ClientRequest (abstract)
    BaseClientRequest (abstract)
        RequestA
        RequestB
        ...
        RequestN

我想做的是用同样的回应镜像请求 -

ClientResponse (abstract)
    BaseClientResponse (abstract)
        ResponseA
        ResponseB
        ...
        ResponseN

到目前为止一切顺利。问题临近。我创建了一个名为ClientServiceUtil的实用程序类 实现了一个名为post()的方法,该方法接受ClientRequest参数,同样返回一个 ClientResponse类型。所有服务调用都使用相同的逻辑。我创建的模型甚至使用了泛型 参数的键值对技术上我只能使用基本级别的类,但它是 早期阶段,我确信逻辑将开始因服务而异 - 因此具体实现。

在我的post方法中,我运行逻辑,作为流程的一部分,我创建了一个存储的ClientResponse对象 结果并返回它。现在问题。

我有一个portlet。 portlet创建一个RequestA对象并使用它调用ClientServiceUtil。它需要ResponseA响应,但它返回的是ClientResponse,因此我有一个分配错误。

ResponseA response = ClientServiceUtil.post( new RequestA() );

...如果我尝试使用强制转换修复此问题,那么显然,我最终会遇到运行时强制转换异常

ResponseA response = (ResponseA)clientServiceUtil.post( new RequestA() );

现在我开始认为重复每个请求的服务调用逻辑(在我的post方法中找到)或将其拆分为部分调用等是我唯一的选择。我真的不想这样做,所以我希望那里的其他人对我有所了解。

2 个答案:

答案 0 :(得分:0)

您可以使用泛型,例如:

public <T, R extends ClientResponse<T>> R post(ClientRequest<T> request) {
    ...
}

答案 1 :(得分:0)

我建议将请求用作一种工厂来创建关联的响应。例如:

public interface ClientRequest {
    ...
    public ClientResponse createResponseInstance();
    ...
}

然后,在ClientServiceUtil中,

public ClientResponse post(ClientRequest req) {
    ...send the request...
    ClientResponse resp = req.createResponseInstance();
    ...initialize values in resp...
    return resp;
}

所以如果你有以下内容:

public class RequestA extends BaseClientRequest {
    ...
    public ClientResponse createResponseInstance() {
        return new ResponseA();
    }
    ...
}

然后post()会在ResponseA作为参数传递时返回RequestA个对象。

这允许您安全地将响应转换为ResponseA。