1. 什么是模板模式
准备一个抽象类,定义一个方法骨架,和一些抽象方法。让每个继承这个类的子类以自己方式实现抽象方法,从但是方法骨架都都是一样的。
简单一点的理解:完成一件事情,有固定的几个逻辑步骤,但是每个步骤根据使用对象的不同,实现细节不同;那就可以定义一个父类,在父类中定义一个完成该事情的总的方法,按照完成事情需要的步骤去调用其每个步骤的实现方法。而每个步骤的实现方法由子类完成。
抽象父类:AbstractClass:实现模板方法,定义了算法的骨架,和其他一些固定的执行步骤方法
实现子类:ConcreatClass:实现抽象类中的抽象方法(不是实现模板方法)。不同的对象有不同的实现细节
2. 那些场景下使用模板模式
模板模式主要是基于类的继承,让代码复用。平时我们在编程时,经常碰到一些类似于RestTemplate,RedisTemplate,JdbcTemplate的模板类,他们就是采用的模板方式。
3. 示例demo
场景模拟:出行场景,不管是坐火车出行还是坐飞机出行,都需要买票,取票,检票,上车等待出发这四个固定的步骤,那出行我们就可以抽象出这四个步骤,并定义一个出行的方法,但是具体是买火车票还是飞机票还是大巴票,就是实现的子类去定义。但是等待上车是对各个子类都是一样的,就可以在父类中直接实现了。
模板类
public abstract class TravelTemplate {
abstract void payTicket();
abstract void getTicket();
abstract void checkTicket();
public void waitToGo(){
System.out.println("准备就绪,等待出发");
}
void travel(){
// 1.买票
payTicket();
// 2.取票
getTicket();
// 3.检票
checkTicket();
// 4.等待出发
waitToGo();
}
}
火车出行实现类
public class TrainTravel extends TravelTemplate{
@Override
void payTicket() {
System.out.println("买火车票");
}
@Override
void getTicket() {
System.out.println("取火车票");
}
@Override
void checkTicket() {
System.out.println("检火车票");
}
}
飞机出行实现类
public class PlanTravel extends TravelTemplate{
@Override
void payTicket() {
System.out.println("买飞机票");
}
@Override
void getTicket() {
System.out.println("取飞机票");
}
@Override
void checkTicket() {
System.out.println("检飞机票");
}
}
测试类
public static void main(String[] args) {
PlanTravel planTravel = new PlanTravel();
planTravel.travel();
System.out.println("--------------------");
TrainTravel trainTravel = new TrainTravel();
trainTravel.travel();
}
测试结果
买飞机票
取飞机票
检飞机票
准备就绪,等待出发
--------------------
买火车票
取火车票
检火车票
准备就绪,等待出发
4. 总结
使用模板方式的优点主要是具体细节实现步骤定义在子类中,子类定义详细处理算法是不会改变父类中模板方法的实现结构的,使得代码能够复用;缺点是每个不同的实现都需要定义一个子类,使得类的个数增加,系统更加庞大。