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

之前写过一个服务器程序, 大概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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(1)
Ty80

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;
    }
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!