模板方法模式:
定义一个操作的流程框架,而将流程中一些步骤延迟到子类中实现。使得子类在不改变流程结构的情况下,重新定义流程中的特定步骤。
主要角色:
抽象类: 负责给出操作流程的轮廓或框架,由模板方法和若干基本方法组成。
1、抽象方法:由抽象类声明,在具体子类中实现个性化逻辑。
2、具体方法:在抽象类中实现的公共方法(也可以在子类中覆盖)
3、模板方法:定义了流程框架,按照流程顺序调用抽象或者具体方法。
具体子类: 实现抽象类中所定义的抽象方法。
类图
优点:
1、将相同的逻辑代码通过 concreateMethod 提取到抽象类中,提高了代码复用性。
2、、实现了反向控制,符合开闭原则。通过父类抽象类调用子类的具体实现,实现了反向控制。
缺点
1、每个不同的实现都需要定义一个子类,会导致类的个数增加,使系统更庞大。
2、父类中的抽象方法由子类实现,子类的结果影响父类的结果,提高代码的阅读难度。
案例
需求背景: 实现一个客户创建接口供外部系统调用,包括客户基础信息、客户地址信息、客户联系人信息三个维度。每个维度都有系统来源、有效期字段。数据写入要对基本信息校验,及查询数据库做重复性校验。
设计思路: 定义一个基础的抽象类,包含抽象主键校验,和具体的系统来源字段校验,模板方法内调用两个校验。在具体的客户、地址、联系人类中实现具体的主键校验逻辑。
实际项目感悟:
1、这种设计模式concreateMethod 可以将公用部分有效提取,简化代码。
2、AbstractMethod 实现往往需要使用泛型,包括方法的入参和返回结果。
3、这种设计模式在未学习前,提取了抽象类和一些公共逻辑放在具体方法中,但是没有考虑到再创建一个模板方法,将抽象方法和具体方法串联起来。