java有关装饰器的重构

之前写过一个服务器程序, 大概2000多行吧, 最近看到了发现写的太烂了, 就想着重构一下, 现在有4个接口与4个类, 分别是Request接口,Response接口,HttpRequest接口,HttpResponse接口以及相应的实现类DefaultRequest和DefaultResponse, DefaultHttpRequest和DefaultResponse接口.
类图大概是这样子的:

我的DefaultHttpRequest/DefaultHttpResponse是通过装饰器模式持有一个DefaultRequest/DefaultResponse来完成Request,ServletRequest/Response,ServletResponse接口的功能. 然后自己实现HttpRequest,HttpServletRequest/HttpResponse,HttpServletResponse接口的功能;

Response接口中有一个getRequest和setRequest方法
HttpResponse接口中有一个getHttpRequest和setHttpRequest方法.
这几个方法用于Request和Response进行通讯使用.

但是这就出现了一个问题:
DefaultHttpResponse的getHttpRequest和getRequest如果想要返回的httpRquest所持有的request和request是同一个的话, 就需要外部环境来保证, 所以我写的代码是这样的:

//request和response是由其他类解析http请求传递进来的
DefaultHttpRequest defaultRequest = new DefaultHttpRequestrequest ;
DefaultHttpResponse defaultHttpResponse = new DefaultHttpResponseresponse ;
defaultHttpResponse.setRequestrequest ;
defaultHttpResponse.setHttpRequestdefaultRequest ;

但是我总觉着这样写, 似乎破坏了封装性, 但是不知道该怎么改?

你的意思是 defaultHttpResponse.setRequestdefaultHttpResponse.setHttpRequest 的参数是有紧密联系的,这种情况你可以只保留一个 set 接口,就是 setRequest,提供一个 get 接口,getDefaultRequest,大概就像这样

class DefaultHttpResponse { private HttpRequest request; private DefaultHttpRequest defaultRequest; public void setRequestHttpRequest request { this.request = request; defaultRequest = new DefaultHttpRequestrequest; } public HttpDefaultReqeust getDefaultRequest { return defaultRequest; }
}

也可以通过互斥来保证

class DefaultHttpResponse { private HttpRequest request; private DefaultHttpRequest defaultRequest; public void setRequestHttpRequest request { if defaultRequest != null { throw new RuntimeException; } this.request = request; defaultRequest = new DefaultHttpRequestrequest; } public void setDefaultRequestDefaultHttpRequest defaultRequest { if request != null { throw new RuntimeException; } this.defaultReqeust = defaultRequst; request = defaultRequest.getRequest; }
}

或者一致性检查

class DefaultHttpResponse { private HttpRequest request; private DefaultHttpRequest defaultRequest; public void setRequestHttpRequest request { if defaultReqeust != null && defaultReqeust.getRequest != request { throw new RuntimeException; } this.request = request; } public void setDefaultRequestDefaultHttpRequest defaultRequest { if request != null && defaultReqeust.getRequest != request { throw new RuntimeException; } this.defaultRequest = defaultRequest; }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注