设计模式 - java有关装饰器的重构
高洛峰
高洛峰 2017-04-18 09:54:54
0
1
368

之前写过一个服务器程序, 大概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) ;

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(1)
Ty80

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;
    }
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!