模板方法模式(Template Method)
定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。
让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。
模板方法模式是编程中经常用到的模式,其非常简单,AbstractClass叫抽象模板,其方法分为3类:
1.抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
2.模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,**模版方法大多会定义为final类型**,指明主要的逻辑功能在子类中不能被重写。
3.钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
JDK中模板方法模式的使用
- java.io.InputStream, java.io.OutputStream, java.io.Reader 以及 java.io.Writer 中所有非抽象方法。
- java.util.AbstractList, java.util.AbstractSet 以及 java.util.AbstractMap中所有非抽象方法。
//抽象检测类(抽象模板方法)
abstract class AbstractCheck {
abstract void startup();
abstract void speeup();
abstract void brake();
abstract void stop();
//防止子类覆盖使用final修饰
public final void check(){
startup();
speeup();
brake();
stop();
}
}
//检测911
class Porsche911 extends AbstractCheck {
@Override
void startup() {
System.out.println("检测911启动");
}
@Override
void speeup() {
System.out.println("检测911加速");
}
@Override
void brake() {
System.out.println("检测911刹车");
//检测方法标准
System.out.println("911刹车合格");
}
@Override
void stop() {
System.out.println("检测911熄火");
}
}
//检测Cayma类
class Cayma extends AbstractCheck {
@Override
void startup() {
System.out.println("检测Cayma启动");
}
@Override
void speeup() {
System.out.println("检测Cayma加速");
}
@Override
void brake() {
System.out.println("检测Cayma刹车");
//检测方法标准
System.out.println("Cayma刹车合格");
}
@Override
void stop() {
System.out.println("检测Cayma熄火");
}
}
public class Main {
public static void main(String[] args) {
AbstractCheck ac = new Porsche911();
//开始检测911
ac.check();
//检测Cayma
AbstractCheck ca = new Cayma();
ca.check();
}
}