Maison  >  Questions et réponses  >  le corps du texte

设计模式 - 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 DefaultHttpRequest(request) ;
DefaultHttpResponse defaultHttpResponse = new DefaultHttpResponse(response) ;
defaultHttpResponse.setRequest(request) ;
defaultHttpResponse.setHttpRequest(defaultRequest) ;

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

高洛峰高洛峰2714 Il y a quelques jours372

répondre à tous(1)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 09:56:54

    Ce que vous voulez dire, c'est que les paramètres de defaultHttpResponse.setRequest() et defaultHttpResponse.setHttpRequest() sont étroitement liés. Dans ce cas, vous ne pouvez conserver qu'une interface définie, qui est setRequest, et fournir une interface get, getDefaultRequest(), ce qui est probablement comme par ici

    class DefaultHttpResponse {
        private HttpRequest request;
        private DefaultHttpRequest defaultRequest;
    
        public void setRequest(HttpRequest request) {
            this.request = request;
            defaultRequest = new DefaultHttpRequest(request);
        }
    
        public HttpDefaultReqeust getDefaultRequest() {
            return defaultRequest;
        }
    }

    Elle peut aussi être garantie par exclusion mutuelle

    class DefaultHttpResponse {
        private HttpRequest request;
        private DefaultHttpRequest defaultRequest;
    
        public void setRequest(HttpRequest request) {
            if (defaultRequest != null) {
                throw new RuntimeException();
            }
            this.request = request;
            defaultRequest = new DefaultHttpRequest(request);
        }
    
        public void setDefaultRequest(DefaultHttpRequest defaultRequest) {
            if (request != null) {
                throw new RuntimeException();
            }
            this.defaultReqeust = defaultRequst;
            request = defaultRequest.getRequest();
        }
    }

    ou contrôle de cohérence

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

    répondre
    0
  • Annulerrépondre