【发布时间】:2020-01-24 20:18:07
【问题描述】:
这些是一组都遵循相同算法的服务。消费者调用这些服务,服务将消费者的请求发送到某个后端系统。服务接口是 RESTful,后端是 SOAP。因为它们都遵循相同的模式,所以我们有一个抽象类。方法的顺序是固定的,即 commonMethodOne 需要在 commonMethodTwo 之前发生,等等。
具体类必须实现两个抽象方法,因为每个服务接口都不同。
public abstract class CommonService<T1, T2, T3, T4> {
public T4 getResponse(T1 request) {
T2 backendRequest = transformClientRequestToBackendRequest(request);
commonMethodOne(request);
commonMethodTwo(request);
T3 backendResponse = getBackendResponse(backendRequest);
commonMethodThree(backendResponse);
commonMethodFour(backendResponse);
return transformBackendResponseToClientResponse(backendResponse);
}
public abstract T2 transformClientRequestToBackendRequest(T1 request);
public abstract T4 transformBackendResponseToClientResponse(T3 backendResponse);
public void commonMethodOne(T1 request) {
//some code
}
public void commonMethodTwo(T1 request) {
//some code
}
public void commonMethodThree(T3 backendResponse) {
//some code
}
public void commonMethodFour(T3 backendResponse) {
//some code
}
public T3 getBackendResponse(T2 backendRequest) {
// call to backend system
}
}
问题如下。 95% 的服务将遵循这种模式。但是,一小部分需要客户端请求才能将后端响应转换为客户端响应。
所以方法:
public abstract T4 transformBackendResponseToClientResponse(T3 backendResponse);
会变成:
public abstract T4 transformBackendResponseToClientResponse(T1 clientRequest, T3 backendResponse);
但是,这仅适用于一小部分服务。因此,我不想为 95% 的服务添加另一个抽象方法,或者更改签名以保留一个方法,因为这将更改具体类。另一种解决方案是拥有一个包含公共方法的父抽象类和两个子抽象类。每个都有不同的transformBackendResponseToClientResponse 风格,但getResponse 必须在每个抽象类中重复。
如何在不重复代码的情况下实现?
【问题讨论】:
标签: java code-duplication factory-method