moco代码赏析一

2018-01-25  本文已影响0人  hopelty

本次主要是赏析作者的第一次提交intialized project,这次提交主要把项目的雏形搭建起来和单元测试两部分内容。


先从项目的组织框架来看,项目共有八个类,其中Moco类是入口,有server()方法和running()方法,server()方法的作用是新创建一个MocoServer对象并返回,running()方法则是启动该MocoServer对象。MocoServer类是服务器类,有启动、停止、response等方法。MocoHandler类继承了SimpleChannelHandler类,重写了messageReceived()方法,当收到request后,负责把RequestSetting写入response返回。RequestSetting、BaseRequestSetting、AnyRequestSetting、URIRequestSetting、ContentRequestSetting这五个类的关系如下:

image

其中三个RequestSetting实现类是针对不同的request输入类型或不同的请求方式,所做的三种不同的处理方法。


下面看一些具体的代码,

    public void response(String response) {
        new AnyRequestSetting(this).response(response);
    }

    public BaseRequestSetting withContent(String requestContent) {
        return new ContentRequestSetting(this, requestContent);
    }

    public BaseRequestSetting withUri(String uri) {
        return new UriRequestSetting(this, uri);
    }

这三个方法分别对应Request中的三种不同的输入或请求方式:get请求、post请求、输入为uri(addrA/addrB)。根据不同的输入,new出来不同的RequestSetting对象装入response中。

RequestSetting的五个类中多次运用了多态,如:RequestSetting中的addToServer()抽象方法,在BaseRequestSetting中得到了重写、BaseRequestSetting中match()方法是个抽象方法,三个实现类分别重写了这个方法,拥有了针对不同的输入的不同处理方法。

    public abstract boolean match(HttpRequest request);
    public boolean match(HttpRequest request) {
        return true;
    }
    public boolean match(HttpRequest request) {
        long contentLength = HttpHeaders.getContentLength(request);
        ChannelBuffer contentBuffer = request.getContent();
        String content = contentBuffer.toString((int) (contentBuffer.capacity() - contentLength), (int) contentLength, Charset.defaultCharset());

        return content.equals(this.content);
    }
    public boolean match(HttpRequest request) {
        return (request.getUri().equals(uri));
    }

在这版代码中,由于下两段代码中的isMatchAny被作者在三个RequestSetting的实现类中均置为false,所以有两部分代码是不会被访问的。我想作者这么做一定是有意为之,目的是为了针对不同的业务需求而做更好的扩展,且等日后继续看后面的代码~

    if (requestSetting.isMatchAny()) {
        this.anyRequestSetting = requestSetting;
    }
    if (anyRequestSetting != null) {
        channel.write(createResponse(anyRequestSetting));
    } else {
        channel.write(new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST));
    }
上一篇下一篇

猜你喜欢

热点阅读