模板方法是通过继承实现的复用,通过一个抽象父类来实现;针对不同的业务类型或者算法,在父类中定义一个模板方法,而其中的不同的实现细节由各自的子类去实现;相同的业务逻辑或者算法可以在父类中统一实现,减少代码量,实现复用,并且也不会改变总体的执行步骤。
先上源码:
public abstract class AbstractTemplate {
/*
* 设置成final防止子类重写此方法
*/
public final void templateMethod(){
concreteMethod();
abstractMethod();
hookMethod();
}
/*
* 抽象方法需要由子类实现
*/
protected abstract void abstractMethod();
/*
* 钩子方法,子类中可实现,可不实现
*/
protected void hookMethod(){};
private final void concreteMethod(){
//类似业务或逻辑中相同的代码
}
}
模板方法模式达到了很好的实现了高可用低耦合的技术,也符合开闭原则,能够减少冗余代码,易于扩展。
在java中有很多典型的使用模板方法模式的例子,例如JDK中非常著名的AQS(AbstractQueuedSynchronizer),他就是使用了模板方法模式。
在父类的AbstractQueuedSynchronizer类中定义了统一的release,acquire方法,而他们调用的tryRelease,tryAcquire方法就是需要不同的子类去实现,像ReentrantLock就分别去实现这两个方法,这是典型的模板方法模式用法示例,具体可以研究下jdk中的源码:java.util.concurrent.locks.AbstractQueuedSynchronizer。