java有关装饰器的重构

发布于 2022-09-03 14:03:06 字数 1175 浏览 15 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

游魂 2022-09-10 14:03:06

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

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

也可以通过互斥来保证

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

或者一致性检查

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;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文