概述
模板模式是在一个方法中定义了一个算法的骨架,相同部分在父类中实现,不同部分延迟到字类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
案例
烹饪的例子
打开油烟机
点火
炒菜花、炒鸡蛋、炒土豆......
关火
关闭油烟机
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{
@Override
public void doCook(){
System.out.println("炒菜花");
}
}
public class CookJidan extends Cook{
@Override
public void doCook(){
System.out.println("炒鸡蛋");
}
}
public class CookTudou extends Cook{
@Override
public 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();
}
总结
优点:封装不变的公共代码,便于维护,可变部分的代码由子类自由决定,扩展性强
缺点:每新增一个不同的实现类都需要新增一个子类,可能导致类的数量变多,增加系统的复杂性