概述

模板模式是在一个方法中定义了一个算法的骨架,相同部分在父类中实现,不同部分延迟到字类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

案例

  1. 烹饪的例子
  2. 打开油烟机
  3. 点火
  4. 炒菜花、炒鸡蛋、炒土豆......
  5. 关火
  6. 关闭油烟机
  7. public abstract class Cook{
  8. public void open(){
  9. System.out.println("打开油烟机");
  10. }
  11. public void fire(){
  12. System.out.println("点火");
  13. }
  14. //期待子类去实现,根据不同的菜品选择不同的实现
  15. public abstract void doCook();
  16. public void outFire(){
  17. System.out.println("关火");
  18. }
  19. public void close(){
  20. System.out.println("关闭油烟机");
  21. }
  22. //使用final关键字修饰,防止子类重写
  23. //定义了一套算法骨架
  24. public final void cook(){
  25. this.open();
  26. this.fire();
  27. this.doCook();
  28. this.outFire();
  29. this.close();
  30. }
  31. }

注意:
A、final关键字修饰,防止子类重写算法骨架
B、将不同点交给子类去实现。定义了抽象方法

  1. public class CookCaiHua extends Cook{
  2. @Override
  3. public void doCook(){
  4. System.out.println("炒菜花");
  5. }
  6. }
  7. public class CookJidan extends Cook{
  8. @Override
  9. public void doCook(){
  10. System.out.println("炒鸡蛋");
  11. }
  12. }
  13. public class CookTudou extends Cook{
  14. @Override
  15. public void doCook(){
  16. System.out.println("炒土豆");
  17. }
  18. }

模板方法类图

模板模式 - 图1

模板模式中的钩子概念

  1. //可在方法执行之前,做一些初始化工作
  2. public void beforeCook(){};
  3. //可在方法执行后执行一些清理工作
  4. public void afterCook(){};
  5. /**
  6. * 使用final关键字,防止子类重写
  7. */
  8. public final void cook(){
  9. beforeCook();
  10. this.open();
  11. this.fire();
  12. this.doCook();
  13. this.outfire();
  14. this.close();
  15. afterCook()
  16. }

模板模式在spring中的应用

— 没看明白,回来继续
— 事务模板

项目中的应用

  1. 对账系统 -- 获取客户端链接 SFTPClient,获取客户端的步骤是一样的,但是每个渠道的配置是不一样的
  2. -- 工行渠道,sftp客户端相关参数配置
  3. -- 农行渠道,sftp客户端相关参数配置
  4. -- 招行渠道,sftp客户端相关参数配置
  5. public void init(){}
  6. public void connect(){}
  7. public Client getClient(){
  8. init();
  9. connect();
  10. }

总结

优点:封装不变的公共代码,便于维护,可变部分的代码由子类自由决定,扩展性强
缺点:每新增一个不同的实现类都需要新增一个子类,可能导致类的数量变多,增加系统的复杂性