模板模式(Template Pattern):一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
我们先来定义一个方法类,思考一下这样定义的好处是什么:
//抽象方法类
public abstract class Method {
abstract void method1();
abstract void method2();
abstract void method3();
//封装了上面几个方法的执行过程
void run() {
method1();
method2();
method3();
}
}
这样定义后,我们只能去重写Method类的三个method方法,但是run方法依然会将这三个方法按照接口本身定义的顺序执行:
//Method子类
public class MyMethod extends Method {
@Override
void method1() {
System.out.println("执行方法一");
}
@Override
void method2() {
System.out.println("执行方法二");
}
@Override
void method3() {
System.out.println("执行方法三");
}
}
运行一下:
public static void main(String[] args) {
MyMethod myMethod = new MyMethod();
myMethod.run();
}
结果:
执行方法一
执行方法二
执行方法三
当然如果想保证run方法不被重写我们可以加上final。还可以定义自己的执行顺序:
//抽象方法类
public abstract class Method {
abstract void method1();
abstract void method2();
abstract void method3();
//封装了上面几个方法的执行过程,且不允许重写此方法
final void run() {
method1();
method2();
method3();
}
}
//Method子类
public class MyMethod extends Method {
@Override
void method1() {
System.out.println("执行方法一");
}
@Override
void method2() {
System.out.println("执行方法二");
}
@Override
void method3() {
System.out.println("执行方法三");
}
//自定义顺序
void myRun() {
method3();
method2();
method1();
}
}
运行一下:
public static void main(String[] args) {
MyMethod myMethod = new MyMethod();
myMethod.run();
System.out.println("----------------");
myMethod.myRun();
}
结果:
执行方法一
执行方法二
执行方法三
----------------
执行方法三
执行方法二
执行方法一