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

这篇具有很好参考价值的文章主要介绍了【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

  • 代码仓库
    hamcrest github 仓库

1. 类图概览

  • 看个大概的类图。很经典的接口、抽象类、子类实现
    【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用,源码,Java,设计模式,模板方法模式,设计模式

2. 源码阅读

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

2.1 抽象类 BaseMatcher

基类提供了基础方法。
【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用,源码,Java,设计模式,模板方法模式,设计模式

  • 一个很有趣的方法名
    在接口层面告诉使用者不要直接实现 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();
}

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

  • BaseMatcher 主要使用的 StringDescription
    【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用,源码,Java,设计模式,模板方法模式,设计模式

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

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

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 方法调用链如下 (省掉了与该模式无关的方法和类)
    【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用,源码,Java,设计模式,模板方法模式,设计模式
  • 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 )。文章来源地址https://www.toymoban.com/news/detail-728333.html

到了这里,关于【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

    2024年01月23日
    浏览(29)
  • [设计模式Java实现附plantuml源码~创建型] 确保对象的唯一性~单例模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

    2024年01月19日
    浏览(44)
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法

    2024年02月01日
    浏览(65)
  • java单元测试( Hamcrest 断言)

    单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试? 为了防止错误(很明显!) 而且还可以提高开发人员的生产力,因为单元测试: (1) 帮助实施——在编码的同时编写测试可以快速反馈正在编写的代码。 (2) 失败时应该易于理解——每个测试在

    2024年02月06日
    浏览(29)
  • JAVA设计模式第七讲:设计模式在 Spring 源码中的应用

    设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案。本文以面试题作为切入点,介绍了设计模式的常见问题。 我们需要掌握各种设计模式的原理、实现、设计意图和应用场景,搞清楚能解决什么问题 。 本文是第七篇:设计模式在 Spring 源码中的

    2024年02月09日
    浏览(33)
  • [设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

    2024年01月21日
    浏览(35)
  • 【FastCAE源码阅读5】使用VTK实现鼠标拾取对象并高亮

    鼠标拾取对象是很多软件的基本功能。FastCAE的拾取比较简单,是通过VTK实现的。 对几何而言,拾取类型切换在工具栏上,单击后再来单击视图区对象进行拾取,拾取后的对象会高亮显示。效果如下图: 一、拾取对象 拾取对象是在PropPickerInteractionStyle类实现的,该类是vtkInt

    2024年02月02日
    浏览(42)
  • Java 代理模式的基本概念、使用场景、应用示例和实现方法

    代理模式是一种常见的设计模式,在 Java 开发中被广泛应用。它允许我们通过添加一个代理对象来控制对另一个对象的访问,从而提供了一种间接访问实际对象的方法。本文将详细介绍 Java 代理模式的基本概念、使用场景、应用示例和实现方法等相关内容。 代理模式是一种结

    2024年02月05日
    浏览(47)
  • 模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用

    今天,我们再学习另外一种行为型设计模式,模板模式。我们多次强调,绝大部分设计模式的原理和实现,都非常简单,难的是掌握应用场景,搞清楚能解决什么问题。模板模式也不例外。模板模式主要是用来解决 复用 和 扩展 两个问题。 模板模式的原理与实现 模板方法模

    2024年02月16日
    浏览(21)
  • 【开源与项目实战:开源实战】77 | 开源实战一(下):通过剖析Java JDK源码学习灵活应用设计模式

    上一节课,我们讲解了工厂模式、建造者模式、装饰器模式、适配器模式在 Java JDK 中的应用,其中,Calendar 类用到了工厂模式和建造者模式,Collections 类用到了装饰器模式、适配器模式。学习的重点是让你了解,在真实的项目中模式的实现和应用更加灵活、多变,会根据具体

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包