这些是一组都遵循相同算法的服务。消费者调用这些服务,这些服务将对消费者的请求发送到某个后端系统。服务接口是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
必须在每个抽象类中重复。
如何在没有代码重复的情况下实现?