我最近在处理一个应用程序并且有一个用例,我将一组响应返回给客户,例如允许,拒绝和待定。
假设服务返回的响应是PENDING,我希望客户端在给定的时间间隔后重试。此间隔由服务器提供。
我想了解围绕此类用例建模服务响应的最佳做法。我想要得到这样的回答:
字符串决策; long retryIntervalInMinutes;
但是为了决定ALLOW和DENY,retryIntervalInMinutes没有意义,不应该返回。
建模的一种方法:
决定 - 抽象课 允许扩展决策 拒绝延伸决定 待定延伸决定
只有Pending对象才会包含retryIntervalInMinutes。
但是这有其自身的问题,因为客户端将如何解释这样的响应而不使用instanceof或类型转换等。
或者还有其他更好的方法来模拟这样的反应吗?
答案 0 :(得分:0)
为什么不在默认情况下返回0的抽象getRetryInterval()
类中使用Decision
方法并在Pending
具体类中覆盖它?
此外,您可以使用仅在isEntryAllowed()
课程中返回true
的方法Allow
。
您的客户可以使用这两种方法来发现答案的含义,而不是isntanceof
。
简单的枚举会更好,因为响应是不可变的单例:
public enum Response {
ALLOW, DENY, RETRY;
public boolean isEntryAllowed() {
return this == ALLOW;
}
public boolean isRetryAllowed() {
return this == RETRY;
}
public int getRetryInterval() {
return this == RETRY ? 42 : -1;
}
}
客户获得一些Response
实例,可以使用它的方法找出响应的含义:
Response respone = sendRequestToServer();
if (response.isEntryAllowed()) {
// cool! let's move on!
} else if (response.isRetryAllowed()) {
retryAfter(response.getRetryInterval());
} else {
// too bad, need to find another server or sth
}
答案 1 :(得分:0)
零也是一个数字。如果您的类具有retry-delay属性(即应该等待的持续时间),那么在没有延迟的情况下,您可以将该属性设置为零。
对于将延迟传达给客户端的Web服务,名为Retry-After的标准HTTP头是适当的介质。