Java设计模式之Template Pattern模板模式详解
作者:十维豆脑
一、定义
模板模式(Template Pattern):行为型模式之一,抽象父类定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
二、UML类图
三、角色职责
抽象类/抽象模板(Abstract Class):抽象模板类,负责给出一个算法的轮廓和骨架。 它
由一个模板方法和若干个基本方法构成。这些方法的定义如下:
- 模板方法:定义了一套算法的骨架,按某种顺序调用其包含的基本方法。
- 基本方法:是算法骨架/流程的某些步骤进行具体实现,包含以下几种类型,
- 抽象方法:在抽象类中声明,由具体子类实现。 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
- 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
具体子类/具体实现(Concrete Class):具体实现类,实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
四、代码实现
前言:在平时工作中就经常会用到模板方法,就像我们公司的框架里使用的Excel导入功能EasyExcel,就是一个非常典型的模板方法,我们通常会顶一个抽象类并在里面规定出一些模板方法和基本方法,再由具体的实现类去进行调用或者重写,下面就用代码给大家举个栗子。
导入抽象类(抽象类 Abstract Class)
abstract class ImportAbstractClass { public void TemplateMethod() { validateColumn(); validateField(); bizHandle(); } public void validateColumn() { System.out.println("校验导入Excel的列名..."); } public abstract void validateField(); public abstract void bizHandle(); }
导入订单实现类(具体子类 Concrete Class)
public class ImportOrderClass extends ImportAbstractClass { @Override public void validateField() { System.out.println("校验导入订单字段..."); } @Override public void bizHandle() { System.out.println("订单业务处理..."); } }
导入商品实现类(具体子类 Concrete Class)
public class ImportProductClass extends ImportAbstractClass { @Override public void validateField() { System.out.println("校验导入商品字段..."); } @Override public void bizHandle() { System.out.println("商品业务处理..."); } }
测试类
public class TemplateTest { public static void main(String[] args) { ImportAbstractClass order = new ImportOrderClass(); order.TemplateMethod(); ImportAbstractClass product = new ImportProductClass(); product.TemplateMethod(); } }
输出结果
校验导入Excel的列名...
校验导入订单字段...
订单业务处理...
校验导入Excel的列名...
校验导入商品字段...
商品业务处理...
五、源码分析
模板模式的应用场景非常多,就比如我们常用的MyBatis中的BaseExecutor类就使用到了模板模式。
在主流程中,我们可以直接调用query方法,也可以通过实现抽象方法doQuery进行使用。
六、优缺点分析
优点:
- 不变部分封装到父类实现,而把可变部分由子类继承实现,便于子类继续扩展。
- 在父类中提取了公共的部分代码,便于代码复用。
- 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
- 对每个不同的实现都需要定义一个子类,导致类的个数增加,系统更庞大,设计更抽象。
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,它提高了代码阅读的难度。
七、适用场景
- 多个子类有共有的方法,并且逻辑基本相同。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
八、总结
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑模板方法模式来处理。模板模式只是在一定程度上完成了解耦的操作,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行文搬移到单一的地方(提取公有部分,抽象成抽象方法),这样就帮助子类摆脱重复的不变行为的纠缠。
到此这篇关于Java设计模式之Template Pattern模板模式详解的文章就介绍到这了,更多相关Template Pattern模板模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!