模板模式在有些场景下非常好用,传统的模板模式,一般是声明一个抽象类,在抽象类里面实现一些逻辑,但有些方法声明为抽象,由子类实现。但模板模式有个问题:单元测试比较麻烦。因为用到了继承,不好隔离测试。(据说Java创始人说过最后悔的就是加了抽象类)典型代码如下:
public class TemplateMain { public void doSomething() { //some code String method1 = method1(); System.out.println(method1); } protected abstract String method1(); }
经验告诉我们,用聚合而不是继承。那么我们试试用接口聚合进去看看:
public class TemplateMain { TemplateInterface templateInterface; public void doSomething() { //some code String method1 = templateInterface.method1(); System.out.println(method1); } interface TemplateInterface { String method1(); } }
实例化的时候,通过外界注入不同的TemplateInterface,实现模板模式的功能。
TemplateInterface的子类可以单独测试,TemplateMain用Mock TemplateInterface也可以单独测试。