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

news2024/12/27 1:20:15

文章目录

    • 前言
    • 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/1066612.html

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

相关文章

【芯片设计- RTL 数字逻辑设计入门 4 - 第一个 RTL Bug 分析之路 】

文章目录 1.1 Veloce 验证1.1.1 问题背景1.1.2 问题分析1.1.3 调试小技巧 1.1 Veloce 验证 本文是基于veloce验证平台进行的&#xff0c;关于veloce的介绍如下&#xff1a; 传统的验证技术中,主要采用两种手段。 一种是基于EDA工具(Simulator)的仿真验证。这种验证方式是基于…

谈谈你对 finalize 方法的理解,该怎样回答才能体现出高水平?浮于表面的答案永远不行!

目录 1. finalize 方法是什么&#xff1f; 2. finalize 方法的作用&#xff1f; 3. 为什么强烈不建议在 finalize 方法中进行资源的释放和清理工作 1. finalize 方法是什么&#xff1f; 首先要知道&#xff0c;finalize 方法是 Object 类中的一个方法&#xff0c;从源码中叶…

ES6 class类的静态方法static有什么用

在项目中&#xff0c;工具类的封装经常使用静态方法。 // amap.jsimport AMapLoader from amap/amap-jsapi-loader; import { promiseLock } from triascloud/utils; /*** 高德地图初始化工具*/ class AMapHelper {static getAMap window.AMap? window.AMap: promiseLock(AM…

[PyTorch][chapter 56][GAN 代码实现]

前言&#xff1a; 整个工程分为两个文件: gan.py: 网络模型搭建 main.py: 数据集生成&#xff0c;模型训练 目录&#xff1a; GAN 网络结构 gan.py main.py 一 GAN 网络结构 1.1 训练D 最大化V 1.2 训练G 固定G, 最小化 二 gan.py 功能&#xff1a; 实现 鉴别器D …

vue3+elementPlus el-input的type=“number“时去除右边的上下箭头

改成 代码如下 <script lang"ts" setup> import {ref} from vue const inputBtn ref() </script> <template><el-input type"number" v-model"inputBtn" style"width: 80px;" class"no_number">…

超长表单分页校验,下一页和上一页功能

父组件(最外层) <template><xx-layout title"练习"><divslot"content"class"hierarchy-tag-main"><el-steps:space"200":active"currentComponentIndex 1"align-centerstyle"margin-bottom: 30…

Flutter横屏实践

1、Flutter设置横屏 // 强制横屏 SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight ]); // 强制竖屏 SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);另…

【虹科分享】什么是Redis数据集成(RDI)?

大量的应用程序、日益增长的用户规模、不断扩展的技术需求&#xff0c;以及对即时响应的持续追求。想想这些是否正是你在经历的。也许你尝试过自己构建工具来应对这些需求&#xff0c;但是大量的编码和集成工作使你焦头烂额。那你是否知道&#xff0c;有这样一个工具可以帮助你…

数据结构-图-最小生成树问题

最小生成树 并查集定义举例说明查找某个元素属于哪个集合代码实现路径压缩 Kruskal算法原理代码实现 Prim算法原理代码实现 并查集 定义 &#x1f680;在一些应用问题中&#xff0c;需要将n个不同的元素分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&…

小商品公众号微信店铺搭建的作用是什么

小商品顾名思义就是价格低、需求广且数量多的日用产品&#xff0c;覆盖人群非常广&#xff0c;无论线上还是线下总能找到目标客户&#xff0c;铅笔、削皮刀、晾衣架等各式产品琳琅满目&#xff0c;不少商家也是热衷于小商品的售卖。 从整体来看&#xff0c;小商品商家也可线上…

tomcat整体架构

Tomcat介绍 Tomcat是Apache Software Foundation&#xff08;Apache软件基金会&#xff09;开发的一款开源的Java Servlet 容器。它是一种Web服务器&#xff0c;用于在服务器端运行Java Servlet和JavaServer Pages (JSP)技术。它可 以为Java Web应用程序提供运行环境&#x…

刚入职字节外包一个月,我却离职了...

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

新手选MT4还是MT5,anzo capital昂首资本建议选择MT4,一个原因

在交易中就订单执行策略而言&#xff0c;MT4和MT5哪个更好&#xff0c;相信很多交易者和&#xff0c;anzo capital昂首资本一样很难做出判断。在MT5中&#xff0c;虽然开发人员对发送订单的流程进行了额外的复杂化&#xff0c;同时MT5在订单执行政策方面的优势在于其能够调整全…

告警繁杂迷人眼,多源分析见月明

随着数字化浪潮的蓬勃兴起&#xff0c;网络安全问题日趋凸显&#xff0c;面对指数级增长的威胁和告警&#xff0c;传统的安全防御往往力不从心。网内业务逻辑不规范、安全设备技术不成熟都会导致安全设备触发告警。如何在海量众多安全告警中识别出真正的网络安全攻击事件成为安…

Vue3项目使用Stimulsoft.Reports.js【项目实战】

Vue3项目使用Stimulsoft.Reports.js【项目实战】 相关阅读&#xff1a;vue-cli使用stimulsoft.reports.js&#xff08;保姆级教程&#xff09;_stimulsoft vue-CSDN博客 前言 在BS的项目中我们时常会用到报表打印、标签打印、单据打印&#xff0c;可是BS的通用打印解决方案又…

【JavaEE初阶】 多线程(初阶)——壹

文章目录 &#x1f332;线程的概念&#x1f6a9;线程是什么&#x1f6a9;为啥要有线程&#x1f6a9;进程和线程的区别&#x1f6a9;Java 的线程 和 操作系统线程 的关系 &#x1f60e;第一个多线程程序&#x1f6a9;使用 jconsole 命令观察线程 &#x1f38d;创建线程&#x1f…

字段位置顺序对值的影响

Unity中验证AB加载场景时报错&#xff1a; Cannot load scene: Invalid scene name (empty string) and invalid build index -1 报错原因是因为把字段放在了Start函数后面(图一)改成(图二)就好了。图一中协程使用的sceneBName字段值为null。 图一&#xff1a; 图二&#xff1a…

【C++】List -- 详解

一、list的介绍及使用 https://cplusplus.com/reference/list/list/?kwlist list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&…

Windows10点击开始菜单没反应的四种解决方法

在Windows10电脑中&#xff0c;用户点击开始菜单却出现了没反映的情况&#xff0c;这样用户就无法通过开始菜单来展开操作哦&#xff0c;会给用户的正常操作带来一定程序的影响&#xff0c;下面小编给大家带来四种简单的解决方法&#xff0c;帮助大家轻松恢复Windows10电脑开始…

Selenium 高级定位 CSS

一、CSS选择器概念 CSS拥有自己的语法规则和表达式 CSS通常分为相对定位和绝对定位 CSS常和XPATH一起用于UI自动化测试 二、CSS相对定位使用场景 支持web场景支持app端的webview 三、CSS语法实战 3.1、CSS相对定位的优点 可维护性强语法简洁可以解决各种复杂的定位场景 # …