模板方法(TemplateMethod)
1.什么是模板方法?
在现实生活中,很多事情都包含几个固定步骤,如考试,考试的步骤大致可以分为:拿考卷->作答->交卷。其中拿考卷和交卷的动作
几乎一致,不同的是我们每次考试作答的内容。
在我们写代码的时候,有时候也会遇到类似的情况。就是某个操作需要实现多个步骤,但是其中几个步骤都是固定不变的,只是有些
步骤会变化,这时候,为了提高代码的复用性和系统的灵活性,我们就可以使用---模板方法。
2.模板方法模式定义:
定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该
算法的某些特定步骤。
3.模板方法结构
- 由上图:模板方法定义了一个抽象类和具体子类,抽象类中定义的每一个operation都是一个操作步骤,在templateMethod()
方法中,定义执行上述步骤的顺序等,子类可以通过继承该抽象类,并重新特定步骤实现子类独有的功能。
4.钩子方法
作用:一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。
代码:
AbstractPresellTemplate.java
/**
* 抽象模板类
*/
public abstract class AbstractPresellTemplate {
public final void execute() {
preDoSomething();
abstractMethod();
hookMethod();
afterDoSomething();
}
private void preDoSomething() {
System.out.println("前置通用业务...");
System.out.println("--------------");
}
private void afterDoSomething() {
System.out.println("后置置通用业务...");
}
/**
* 钩子方法,为子类模板提供额外的业务需求入口
*/
public void hookMethod() {
}
/**
* 子类重写方法
*/
public abstract void abstractMethod();
}
ActivityA.java
public class ActivityA extends AbstractPresellTemplate {
@Override
public void abstractMethod() {
System.out.println("活动A业务");
System.out.println("--------------");
}
@Override
public void hookMethod() {
System.out.println("活动A重写钩子方法");
System.out.println("--------------");
}
}
ActivityB.java
public class ActivityB extends AbstractPresellTemplate {
@Override
public void abstractMethod() {
System.out.println("活动B业务");
System.out.println("--------------");
}
}