moco代码赏析一

本次主要是赏析作者的第一次提交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));
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,022评论 6 13
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,494评论 11 349
  • 交缠在一起的舌 舔舐着甜味的津 内心的火焰在缠绵 ------ 啊呸 啊呸 温柔乡被抹去了经纬 怕过吗 怕过 世间...
    长舌妇阅读 2,490评论 0 2
  • 利用清明假期的时间,我终于把老可的《拼的是现在,比的是将来》读完了,说起这本书,带给我最大的感触有以下几点: 1、...
    青鸟的天空727阅读 3,873评论 0 1

友情链接更多精彩内容