一、模式介绍
模板方法模式,顾名思义,就是在父类中提供一个模板方法,将某个业务流程的步骤进行固定,每个步骤的具体实现则可以交给子类自定义去实现。当然,如果所有子类都有的公共步骤可以提取到父类中实现。
@Slf4j
public abstract class AbstractHouse {
/**
* 将子类公共的步骤操作提取到父类中实现
*/
void clean(){
log.info("清理地基");
}
void dig(){
log.info("深挖地基");
}
void fill(){
log.info("填充水泥");
}
/**
* 需要建造几层楼房交给子类去实现
*/
abstract void build();
/**
* 定义模板方法,final防止被子类修改流程
*/
final void buildHouse(){
clean();
dig();
fill();
build();
}
}
@Slf4j
public class Apartment extends AbstractHouse{
@Override
void build() {
log.info("建造30层的公寓!");
}
}
@Slf4j
public class CountryHouse extends AbstractHouse{
@Override
void build() {
log.info("建造3层的乡间楼房!");
}
}
public class Main {
public static void main(String[] args) {
AbstractHouse wanke = new Apartment();
wanke.buildHouse();
AbstractHouse biguiyuan = new CountryHouse();
biguiyuan.buildHouse();
}
}
二、使用案例
- JDK中的AbstractList,其中的
get(int index)
就是一个抽象方法,其实现就交给子类来实现; - HttpServlet中的
service()
、doGet()
、doPost()
方法都是模板方法的抽象实现;
三、模式总结
3.1 优点
- 可以将相同处理逻辑的代码放到抽象父类中,提高代码的复用性;
- 将不同实现的逻辑分离到不同的子类中,通过对子类的扩展来增加新的行为,符合开闭原则;
3.2 缺点
- 如果父类需要增加新的抽象行为,所有子类都要修改一遍;
网友评论