一,模板方法模式简介
1.定义
定义一个操作中的算法的框架,将一些算法的步骤延迟到子类中,使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
2.应用场景
各个子类执行的算法步骤的顺序是一样的,但是对某些步骤的实现是各自不同的
3.举例说明
这是一个汽车模型的抽象
public abstract class AbstractCar {
//启动汽车
public abstract void start();
//汽车鸣喇叭
public abstract void alarm();
//汽车停下
public abstract void stop();
//汽车发动
public abstract void run();
}
现在有两种型号的汽车
A型车
public class CarA extends AbstractCar {
@Override
public void start() {
System.out.println("汽车A正在启动.......");
}
@Override
public void alarm() {
System.out.println("汽车A正在鸣喇叭.......");
}
@Override
public void stop() {
System.out.println("汽车A停下.......");
}
@Override
public void run() {
start();
alarm();
stop();
}
}
B型车
public class CarB extends AbstractCar {
@Override
public void start() {
System.out.println("汽车B正在启动.......");
}
@Override
public void alarm() {
System.out.println("汽车B正在鸣喇叭.......");
}
@Override
public void stop() {
System.out.println("汽车B停下.......");
}
@Override
public void run() {
start();
alarm();
stop();
}
}
有没有发现,两种车的run方法实现一致,但是run方法中的各个操作实现不一致
我们可以把run方法的实现抽象到抽象类中实现,由抽象方法变成实现方法
public abstract class AbstractCar {
//启动汽车
public abstract void start();
//汽车鸣喇叭
public abstract void alarm();
//汽车停下
public abstract void stop();
//汽车发动
// public abstract void run();
public void run() {
start();
alarm();
stop();
}
}
这个就是一个很简单的模板方法的例子,是不是很简单,用到的java基础知识继承而已
二,深入模板方法模式
1.结构
还是用回刚刚的例子,在这里,这个抽象的车是一个抽象模板,在抽象模板里有基本方法和模板方法
基本方法
基本操作,一般交由子类具体实现,一般设置为protected
模板方法
是一个框架,完成对基本方法的调用,实现功能,为了防止被恶意操作,一般会加上final
public abstract class AbstractCar {
//-------->基本方法
//启动汽车
public abstract void start();
//汽车鸣喇叭
public abstract void alarm();
//汽车停下
public abstract void stop();
//-------->模板方法
public void run() {
start();
alarm();
stop();
}
}
2.应用
优点
-
封装不变部分,扩展可变部分
-
提取公共代码,便于扩展维护
-
父类决定行为,子类决定实现
扩展
如果突然有一天出现了新的需求:
A车的喇叭不需要开启,B车的喇叭要一直开启
此时只需要增加多一个抽象方法判断是否需要开启,在修改run方法即可
//是否开启喇叭
public abstract boolean isAlarm();
public void run() {
start();
if(isAlarm()){
alarm();
}
stop();
}
具体开不开喇叭也是取决于子类