【源码】hamcrest 源码阅读及空对象模式、模板方法模式的应用

news2024/11/20 4:27:09

文章目录

    • 前言
    • 1. 类图概览
    • 2. 源码阅读
      • 2.1 抽象类 BaseMatcher
      • 2.1 接口 Description
        • 提炼模式:空对象模式
      • 2. 接口 Description 与 SelfDescribing 配合使用
        • 提炼模式 模板方法
    • 后记

前言

hamcrest ,一个被多个测试框架依赖的包。听说 hamcrest 的源码质量很高,特此来学习一下。建议fork原仓库,拉到本地看代码。

  • 代码仓库
    hamcrest github 仓库

1. 类图概览

  • 看个大概的类图。很经典的接口、抽象类、子类实现
    在这里插入图片描述

2. 源码阅读

将源码逐一拆解,提取有借鉴意义的编码方式。

2.1 抽象类 BaseMatcher

基类提供了基础方法。
在这里插入图片描述

  • 一个很有趣的方法名
    在接口层面告诉使用者不要直接实现 Matcher 接口,而是继承 BaseMatcher
	@Deprecated
    void _dont_implement_Matcher___instead_extend_BaseMatcher_();

2.1 接口 Description

BaseMatcher 中的方法依赖 Description 接口。

	@Override
    public void describeMismatch(Object item, Description description) {}

    @Override
    public String toString() {
        return StringDescription.toString(this);
    }

看看这个接口有什么特殊的地方。

提炼模式:空对象模式
  • Description 接口使用静态内部类包装一个 “空对象”,表达 “什么也不做”
public interface Description {

  /**
   * A description that consumes input but does nothing.
   */
  static final Description NONE = new NullDescription();
}

在这里插入图片描述

  • BaseMatcher 主要使用的 StringDescription
    在这里插入图片描述

可以用idea的查找依赖功能,能看到 “空实现” 使用的地方

在这里插入图片描述

2. 接口 Description 与 SelfDescribing 配合使用

  • 一个有意思的写法
 	@Override
    public String toString() {
        return StringDescription.toString(this);
    }
  • 发现 Matcher 父接口 SelfDescribing 的使用痕迹,用于表达 Matcher 自身的信息 (由开发者决定)
public interface Matcher<T> extends SelfDescribing {}
  • 接口定义
public interface SelfDescribing {
    void describeTo(Description description);
}
提炼模式 模板方法
  • 声明一个自己的matcher 方法调用链如下 (省掉了与该模式无关的方法和类)
    在这里插入图片描述
  • BaseMatcher 中的模板方法就是 toString()
    @Override
    public String toString() {
        return StringDescription.toString(this);
    }
  • 子类需要自定义describe逻辑 (模板方法toString会回调这个方法 )
	@Override
    public void describeTo(Description description) {
    	// EG: BigDecimalCloseTo 的声明
         description.appendText("a numeric value within ")
              .appendValue(delta)
              .appendText(" of ")
              .appendValue(value);
    }

后记

笔者认为,如果存在大量的抽象类实现类,hamcrest 空对象模式可以借鉴一下。
hamcrest 的 toString 模板方法把 describe 逻辑很好的解耦到子类了,下次遇到需要追加上下文的实现可以参考这个模式(如上文的BigDecimalCloseTo )。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1059206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【maven】idea中基于maven-webapp骨架创建的web.xml问题

IDEA中基于maven-webapp骨架创建的web工程&#xff0c;默认的web.xml是这样的。 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

CppCheck静态代码检查工具教程【Windows和Linux端】

目录 1、背景 2、特性介绍 2.1、检查结果 2.2、检查范围 2.3、支持的检查规则&#xff08;列举一些&#xff09;: 2.4、自定义规则 3、linux 端 4、windows 端 1、背景 最近调研了几款 c/c 代码静态检查工具&#xff0c;包括 cppcheck、cpplint、cppdepend、splint、ts…

cmip6数据处理之降尺度

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…

分享Arduino环境下加速下载 第三方库或芯片包

Content 问题描述问题解决 问题描述 众所周知&#xff0c;由于网络的问题&#xff0c;导致Arduino里面的包下载速度非常慢&#xff0c;甚至下了非常久&#xff0c;最后也还是出现下载失败的情况。 有的人打开了加速器&#xff0c;但是也依旧是速度非常慢&#xff0c;为什么呢…

OpenGLES:绘制一个混色旋转的3D圆柱

一.概述 上一篇博文讲解了怎么绘制一个混色旋转的立方体 这一篇讲解怎么绘制一个混色旋转的圆柱 圆柱的顶点创建主要基于2D圆进行扩展&#xff0c;与立方体没有相似之处 圆柱绘制的关键点就是将圆柱拆解成&#xff1a;两个Z坐标不为0的圆 一个长方形的圆柱面 绘制2D圆的…

【列表渲染+收集表单数据+过滤器+内置指令+自定义指令】

列表渲染收集表单数据过滤器内置指令自定义指令 1 列表渲染1.1 基本列表1.2 key的作用与原理1.3 列表过滤1.4 列表排序1.5 Vue监测数据改变的原理 2 收集表单数据3 过滤器4 内置指令4.1 v-text指令4.2 v-html指令4.3 v-cloak指令4.4 v-once指令4.5 v-pre指令 5 自定义指令 1 列…

【网络安全---sql注入(2)】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。

前言 本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件&#xff0c;读取文件。通过SQL输入来注入木马来getshell等&#xff0c;讲解了比较详细的过程&#xff1b; 如果想要学习SQL注入原理以及如何进行SQL注入&#xff0c;我也写了一篇详细的SQL注入方法及…

毅速3D打印:深骨位零件制造首选3D打印

在模具制造领域&#xff0c;深骨位零件由于其复杂形状和结构&#xff0c;传统的加工方法往往难以满足生产要求&#xff0c;导致产品不良问题频繁出现。而如今&#xff0c;随着3D打印技术的普及&#xff0c;深骨位零件在3D打印面前变得不再困难。 3D打印是一种快速成型技术&…

2120 -- 预警系统题解

Description OiersOiers 国的预警系统是一棵树&#xff0c;树中有 &#xfffd;n 个结点&#xff0c;编号 1∼&#xfffd;1∼n&#xff0c;树中每条边的长度均为 11。预警系统中只有一个预警信号发射站&#xff0c;就是树的根结点 11 号结点&#xff0c;其它 &#xfffd;−1…

10.1 调试事件读取寄存器

当读者需要获取到特定进程内的寄存器信息时&#xff0c;则需要在上述代码中进行完善&#xff0c;首先需要编写CREATE_PROCESS_DEBUG_EVENT事件&#xff0c;程序被首次加载进入内存时会被触发此事件&#xff0c;在该事件内首先我们通过lpStartAddress属性获取到当前程序的入口地…

向日葵todesk使用遇到问题

1 设置向日葵自启动 查找向日葵安装位置 dpkg -L sunloginclient 在启动程序中加入向日葵 2 解决正在进入桌面 一直无法进入界面 sudo apt-get update sudo apt-get upgrade sudo apt-get install lightdm # 最后一个执行过程中选择lightdm 3 todesk不能正常启动 sudo sys…

第10章 MySQL(一)

10.1 谈谈MySQL的架构 难度:★★ 重点:★ 白话解析 要想彻底的理解MySQL,它的架构一定要先弄清楚,当Java程序员通过JDBC或者Mybatis去执行一条SQL的时候,到底经历了什么。下边先看一幅图: 户端:Java程序员通过JDBC或者Mybatis去拿MySQL的驱动程序,实际上就是拿客户端。…

kr 第三阶段(三)调试器

调试框架 特点&#xff1a;事件驱动&#xff0c;事件响应。 Win32 程序是消息驱动响应的基址&#xff0c;而在调试器则是事件驱动响应&#xff0c;有事件则处理&#xff0c;无事件则去做别的事。 事件&#xff1a;整个调试框架是建立在异常的基础之上的基本单位。响应&#xf…

EXCEL会计记账报表财务软件企业公司做账系统凭证自动生成报表

本系统基于VBA编程设计&#xff0c;具有界面简洁美观&#xff0c;操作方便快捷&#xff0c;功能完备实用的特点&#xff0c;系统分为基本信息、凭证处理、账簿查询、会计报表、固定资产管理、系统管理、凭证数据库七大模块&#xff0c;您只需要录入记账凭证&#xff0c;就可以自…

(一) 使用 Hugo 搭建个人博客保姆级教程(下篇)

关于博客建站简介,请参考上篇 (一) 使用 Hugo 搭建个人博客保姆级教程(上篇) (一)Hugo 安装 Hugo在多个操作系统下的安装 准备工作 安装golang 安装hugo之前,先安装好golang,推荐安装最新版本。Windows 用户强烈建议使用 Scoop 安装(关于 Scoop 安装及使用可参考 Sc…

HTML5 跨屏前端框架 Amaze UI

Amaze UI采用国际最前沿的“组件式开发”以及“移动优先”的设计理念&#xff0c;基于其丰富的组件&#xff0c;开发者可通过简单拼装即可快速构建出HTML5网页应用&#xff0c;上线仅半年&#xff0c;Amaze UI就成为了国内最流行的前端框架&#xff0c;目前在Github上收获Star数…

【Java每日一题】— —第二十题:杨辉三角(直角三角形)。(2023.10.04)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第二十题。 &#x1f3af;问题&#xff1a; 杨辉三角&#xff08;直角三角形&#xff09;。 解法1 第一步:动态初始化 第二步:为主对角线及第一列的元素赋值1 第三…

C++ 实现运算符重载

代码&#xff1a; #include <iostream> #include <cstring>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

侯捷 C++ STL标准库和泛型编程 —— 8 适配器

8 适配器 适配器 Adapter 只是一个小变化&#xff0c;比如改个接口&#xff0c;函数名称等等其出现在三个地方&#xff1a;仿函数适配器&#xff0c;迭代器适配器&#xff0c;容器适配器可以使用继承 / 复合的两种方式实现&#xff0c;STL中都用复合 其思想就是将该记的东西记…