概述
模板模式是在一个方法中定义了一个算法的骨架,相同部分在父类中实现,不同部分延迟到字类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
案例
烹饪的例子打开油烟机点火炒菜花、炒鸡蛋、炒土豆......关火关闭油烟机public abstract class Cook{public void open(){System.out.println("打开油烟机");}public void fire(){System.out.println("点火");}//期待子类去实现,根据不同的菜品选择不同的实现public abstract void doCook();public void outFire(){System.out.println("关火");}public void close(){System.out.println("关闭油烟机");}//使用final关键字修饰,防止子类重写//定义了一套算法骨架public final void cook(){this.open();this.fire();this.doCook();this.outFire();this.close();}}
注意:
A、final关键字修饰,防止子类重写算法骨架
B、将不同点交给子类去实现。定义了抽象方法
public class CookCaiHua extends Cook{@Overridepublic void doCook(){System.out.println("炒菜花");}}public class CookJidan extends Cook{@Overridepublic void doCook(){System.out.println("炒鸡蛋");}}public class CookTudou extends Cook{@Overridepublic void doCook(){System.out.println("炒土豆");}}
模板方法类图
模板模式中的钩子概念
//可在方法执行之前,做一些初始化工作public void beforeCook(){};//可在方法执行后执行一些清理工作public void afterCook(){};/*** 使用final关键字,防止子类重写*/public final void cook(){beforeCook();this.open();this.fire();this.doCook();this.outfire();this.close();afterCook()}
模板模式在spring中的应用
项目中的应用
对账系统 -- 获取客户端链接 SFTPClient,获取客户端的步骤是一样的,但是每个渠道的配置是不一样的-- 工行渠道,sftp客户端相关参数配置-- 农行渠道,sftp客户端相关参数配置-- 招行渠道,sftp客户端相关参数配置public void init(){}public void connect(){}public Client getClient(){init();connect();}
总结
优点:封装不变的公共代码,便于维护,可变部分的代码由子类自由决定,扩展性强
缺点:每新增一个不同的实现类都需要新增一个子类,可能导致类的数量变多,增加系统的复杂性
