定义
大话设计模式-模板方法(TemplateMethod):
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
上面是官方术语表达。
就是在抽象类中定义执行流程以及实现一些业务共同的逻辑,将最终不同的业务逻辑接口定义为抽象方法,以便不同的子类实现。
实战
一个集团公司对下属公司发优惠券的案例。需要两步,登录和发放优惠券
定义了一个 模板类,里面暴露了一个公共方法,定义了两个步骤,其中登录和发放优惠券都在具体的子类执行。
那么我们在开发扩展其他子公司的时候,只需要继续模板方法,然后实现登录、发优惠券两个接口即可。
模板抽象类
public abstract class TemplateClass {
protected Logger logger = LoggerFactory.getLogger(TemplateClass.class);
String uId; // ⽤用户ID
String uPwd; // ⽤用户密码
public TemplateClass(String uId, String uPwd) {
this.uId = uId;
this.uPwd = uPwd;
}
public String generateGoodsPoster() {
// 1. 验证登录
if (!login(uId, uPwd)) {
return null;
}
// 2.发放优惠券
String result = youHuiTickt();
return result;
}
// 模拟登录
protected abstract Boolean login(String uId, String uPwd);
// 发放优惠券
protected abstract String youHuiTickt();
}
具体实现类
public class CompanyMain extends TemplateClass{
public CompanyMain(String uId, String uPwd) {
super(uId, uPwd);
}
@Override
protected Boolean login(String uId, String uPwd) {
if (uId.equals("main") && uPwd.equals("main")) {
return true;
}
return false;
}
@Override
protected String youHuiTickt() {
return "现金500";
}
}
测试方法
public class ApiTest {
public static void main(String[] args) {
TemplateClass templateClass = new CompanyMain("main", "main");
String result = templateClass.generateGoodsPoster();
System.out.println(result);
}
}
MyBatis 案例
直接搜索 MyBatis 源码即可,最好是打个断点,你懂的……
BaseExecutor 实现 Executor 并添加了部分公用的逻辑,真正的具体逻辑由下面的类实现:
BatchExecutor、SimpleExecutor、ReuseExecutor、ClosedExecutor
一般是 SimpleExecutor 类。
总结
- 通过上面的实现可以看到模版模式 在定义统一结构也就是执行标准上非常方便,也就很好的控制了后续的实现者不⽤关⼼调用逻辑,按照统⼀⽅式执⾏。那么类的继承者只需要关⼼具体的业务逻辑实现即可。
- 另外模版模式也是为了解决⼦类通⽤⽅法,放到⽗类中设计的优化。让每一个子类只做子类需要完成的内容,⽽不需要关心其他逻辑。这样提取公⽤代码,行为由父类管理,扩展可变部分,也就⾮常有利于开发拓展和迭代。