Java 设计:确保响应呈现与响应呈现的清晰分离
这是一个设计/模式问题。我有一个现在也需要的服务 以RESTful web服务的形式公开 在现有代码中,我有一个请求、一个套件的概念 可能的服务操作(策略)和任何服务操作的返回 响应对象。这种方法可以解耦系统的内部工作 来自表示介质的服务(自定义TCP服务器、HTTP REST、HTTP 肥皂等) 我现在开始实现一个MyServiceRESTfulServlet,它看起来像 像这样:Java 设计:确保响应呈现与响应呈现的清晰分离,java,rest,design-patterns,servlets,Java,Rest,Design Patterns,Servlets,这是一个设计/模式问题。我有一个现在也需要的服务 以RESTful web服务的形式公开 在现有代码中,我有一个请求、一个套件的概念 可能的服务操作(策略)和任何服务操作的返回 响应对象。这种方法可以解耦系统的内部工作 来自表示介质的服务(自定义TCP服务器、HTTP REST、HTTP 肥皂等) 我现在开始实现一个MyServiceRESTfulServlet,它看起来像 像这样: public void doGet(HttpRequest httpRequest, HttpResponse
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws ServletException, IOException {
try {
/* Wrap an http servlet request with an adapter which hides all
* the messy details of an HttpRequest and exposes a nice interface
* for working with MyService
*/
IRequest serviceRequest = new MyServiceRESTfulRequest(httpRequest);
/* There's nothing HTTP related in this part, it's the exact same
* code you'd find in other presentation formats. A Response has
* no idea about HTTP, TCP Servers or the like.
*/
Response serviceResponse = dispatchRequest(serviceRequest);
/* A static helper which knows the interface of a Response
* and can translate that into REST-speak for feeding back via
* an HttpServletResponse.
*/
renderRESTfulResponse(serviceResponse, httpResponse);
} catch (Exception e) {
throw new ServletExcetion(e); // Caught by a seperate
// RESTfulErrorServlet
// configured in web.xml
// Rendering an appropriate
// response.
}
}
我的问题是,当前的响应可能有两种:
public enum ResponseKind() {
BINARY, METADATA;
}
对于二进制文件,我的restful响应助手将以一种方式呈现元数据
它需要适当地呈现元数据—一个HTML表、一个JSON表
斑点等
找出哪种类型比较容易-响应对象公开
getOriginalRequest(),经过适当的检查后,可以将其转换为
MyServiceRESTfulRequest,它公开了一个.getAcceptablePresentation()-一个
枚举:
如何最好地保持此渲染代码与响应对象的解耦。
毫无疑问,在未来,其他类型的反应将是可能的。事实上,
renderRESTfulResponse()遍历请求对象并生成
适当地写出数据。它与两个
响应接口(我可以接受),但它知道如何通过
请求对象也是
我只是觉得我没有以一种干净和可维护的方式完成这一点
因为我有剩余的服务。我是每一个“特殊套管”
可能的响应类型,以及每种可能的响应格式。感觉
超级黑客
您能提出任何方法来干净地处理呈现RESTful响应吗
给定一个表示不可知的请求对象?为什么不在RepsonseKind枚举(枚举实际上是类)上实现呈现,或者完全取消它?当您发现自己试图摆脱case/switch语句时,答案通常是组合+重载+命令模式或访问者模式。ResponseKind随后会对HTTP REST产生负担,但在TCP服务器上下文中使用它时,这是没有意义的。访问者模式看起来很有趣。只需让ResponseKind实现多个接口。或者让它发出一个将处理该处理的类型的实例,减去HTTP/REST包。后者将更符合“单一关注点”。
public enum RESTPresentationKind() {
HTML, JSON, XML, PROTOBUF_MYSERV_0.1;
}