什么是模板方法模式?
模板方法(TemplateMethod),定义一个操作中的算法骨架,将一些步骤延迟到子类。模板方方法使得子类可以不改变算法结构,即可重定义算法的某些步骤。
简单来说,模板方法就是定义了做事情的步骤,而这些具体的步骤会根据需求少许改变,但总的步骤结构不变。
模板方法最大的优点在于将一些公共的不变的行为抽取出来以供复用,避免了代码重复。
模板模式结构图:
代码示例:
一个洗衣服的抽象类 WashingTemplate
/**
* @Author DevinLei
*/
abstract class WashingTemplate {
/**
* 打开盖子
**/
abstract void openLid();
/**
* 放入衣服
**/
abstract void putClothes();
/**
* 放入洗衣液
**/
abstract void putWashliquid();
/**
* 关上盖子
**/
abstract void closeLid();
/**
* 打开电源
**/
abstract void openPower();
/**
* 开始洗涤
**/
public void washStart(){
System.out.println("开始洗涤");
}
public void washing(){
openLid();
putClothes();
putWashliquid();
closeLid();
openPower();
washStart();
}
}
具体类PersonA
/**
* @Author DevinLei
*/
public class PersonA extends WashingTemplate {
@Override
void openLid() {
System.out.println("左手打开盖子");
}
@Override
void putClothes() {
System.out.println("放入5件衣物");
}
@Override
void putWashliquid() {
System.out.println("放入立白洗衣液");
}
@Override
void closeLid() {
System.out.println("左手合上盖子");
}
@Override
void openPower() {
System.out.println("左手打开电源");
}
}
具体类PersonB
**
* @Author DevinLei
*/
public class PersonB extends WashingTemplate {
@Override
void openLid() {
System.out.println("右手打开盖子");
}
@Override
void putClothes() {
System.out.println("放入7件衣物");
}
@Override
void putWashliquid() {
System.out.println("放入汰渍洗衣液");
}
@Override
void closeLid() {
System.out.println("右手合上盖子");
}
@Override
void openPower() {
System.out.println("右手打开电源");
}
}
测试类 TestTemplate
/**
* @Author DevinLei
*/
public class TestTemplate {
public static void main(String[] args) {
WashingTemplate person;
person = new PersonA();
person.washing();
person = new PersonB();
person.washing();
}
}
运行结果:
左手打开盖子
放入5件衣物
放入立白洗衣液
左手合上盖子
左手打开电源
开始洗涤
右手打开盖子
放入7件衣物
放入汰渍洗衣液
右手合上盖子
右手打开电源
开始洗涤
Process finished with exit code 0
典型应用:
spring JDBC的设计实现上就是使用的模板方法模式