美文网首页
moco代码赏析一

moco代码赏析一

作者: hopelty | 来源:发表于2018-01-25 20:38 被阅读0次

本次主要是赏析作者的第一次提交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));
    }

相关文章

  • moco代码赏析一

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

  • moco代码赏析十一

    今天来看一下2012.11.7的后三次提交,这三次提交做的事情是比较统一的:用RequestExtractor、C...

  • moco代码赏析十二

    今天要看的是2012.11.8的唯一一次提交,这次提交还是做了很多工作的。 首先,对测试类MocoTest做了重构...

  • moco代码赏析五

    今天来看一下2012.10.30的后三次提交。 提交一:支持了请求时传入一个流 通过stream()方法把流包装成...

  • moco代码赏析六

    今天看的是2012.11.02那天的三次提交,第一次提交加了一些TODO事项,记下了作者接下来要做什么。第二次提交...

  • moco代码赏析四

    对于作者的第四次提交,我们直接从代码的单元测试类入手,来看看做了哪些改动。 以前的调用方式: 现在的调用方式: 我...

  • moco代码赏析十

    接下来看一看2012.11.7的后五次提交。第一次提交,新引入了一个类HttpServer,由MocoHttpSe...

  • moco代码赏析七

    今天看的是2012.11.6的三次提交。 第一次提交作者更改了包名(package name),第三次提交作者更改...

  • moco代码赏析九

    今天来谈一下目前的代码中是如何使用组合模式的。以下是matcher部分的类图和组合模式的类图: Component...

  • moco代码赏析八

    今天来看一下2012.11.7的前四次提交,在下一篇中再聊那天的后五次提交。 首先来看第一次提交,这一次提交主要完...

网友评论

      本文标题:moco代码赏析一

      本文链接:https://www.haomeiwen.com/subject/zfhbaxtx.html