首先,我们先了解一下什么是 模板方法模式:
在一个父类中定义一个流程骨架,将其中一些步骤延迟到子类中,让子类进行各自的实现,可以实现在不改变原有流程的情况下,子类重新定义某些流程中的某些步骤!
我们举个栗子,生活中大家应该都有冲咖啡或者泡茶的习惯吧,我们来看看泡茶跟冲咖啡大概需要那几步
冲咖啡
- 烧开水
- 冲咖啡
- 将冲好的咖啡倒入杯中
- 加牛奶,白糖,或者什么都不加
- 喝咖啡
泡茶
- 烧开水
- 泡茶叶
- 将充好的茶倒入杯中
- 加柠檬等,或者什么都不加
- 喝茶
我们可以发现,冲咖啡跟泡茶其实很像,都是同样的动作,唯一不同的可能就是第二步,一个是冲咖啡,一个是泡茶叶,第四步,一个加牛奶,一个加柠檬,既然发现了差异性,那么我们就能抽象出来,都是冲泡饮料,唯一不同的可能就是饮料的材料不同跟冲泡好后加入的辅助材料不一样,接下来我们就上代码
---------------------------------分割线----------------------------------------
我们先定义一个冲泡饮料的抽象父类
public abstract class BrewBeverage {
void boliWater(){
System.out.println("烧开水");
}
abstract void brew();
void pourIncup(){
System.out.println("将饮料倒入杯中");
}
abstract void addOther();
protected final void drink(){
boliWater();
brew();
pourIncup();
addOther();
}
}
抽象父类已经定义完毕,让子类去实现具体的 冲泡什么饮料,以及添加其它材料
我们定义一个冲咖啡的子类,继承BrewBeverage,实现父类中的 brew跟addOther方法
public class Coffee extends BrewBeverage{
@Override
void brew() {
System.out.println("冲泡咖啡");
}
@Override
void addOther() {
System.out.print("添加牛奶");
System.out.print("添加白糖");
}
}
我们接着定义一个泡茶的子类,继承BrewBeverage,跟冲咖啡子类差不多,唯一不同的可能就是类名跟抽象方法的不同实现
public class LemonTea extends BrewBeverage{
@Override
void brew() {
System.out.println("冲泡茶叶");
}
@Override
void addOther() {
System.out.println("添加柠檬");
}
}
最后我们来看一下测试代码
public static void main(String[] args){
BrewBeverage brewBeverage = new LemonTea();
brewBeverage.drink();
brewBeverage = new Coffee();
brewBeverage.drink();
}
UML图如下
上面可以发现,除了子类实现各种不同的抽象方法实现外,其它步骤都是一致的,这就是模板方法模式,而且也没有违背面向接口的原则,当我们要替换具体实现的时候,只需要将指向泡茶的引用指向泡咖啡的就好了,降低了代码的耦合度
比较常见的就是我们的 JDBCTemplate,它的实现就是使用了模板方法,将连接数据库,开启事务,关闭事务,释放资源等抽离到父类当中,执行具体的SQL抽象出来,让子类去实现,然后调用统一的执行方法
到这,文章就结束了!
以上,均为本人个人理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流
欢迎转载,请注明出处跟作者,谢谢!