Rumah  >  Soal Jawab  >  teks badan

设计模式 - 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) ;

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

高洛峰高洛峰2764 hari yang lalu412

membalas semua(1)saya akan balas

  • PHP中文网

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

    Apa yang anda maksudkan ialah parameter defaultHttpResponse.setRequest() dan defaultHttpResponse.setHttpRequest() berkait rapat Dalam kes ini, anda hanya boleh menyimpan antara muka yang ditetapkan, iaitu setRequest dan menyediakan antara muka get, getDefaultRequest(), yang mungkin seperti Ini

    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;
        }
    }

    Ia juga boleh dijamin melalui pengecualian bersama

    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();
        }
    }

    atau semakan konsisten

    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;
        }
    }

    balas
    0
  • Batalbalas