使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。
可以联想在线电子邮件和普通邮递的区别。 基类定义操作过程的整体结构:
abstract class BaseProcedure {
public final void proceed() {
step1();
step2();
}
public abstract void step1();
public abstract void step2();
}
子类根据需要定制某些步骤:
class OnlineProcedure extends BaseProcedure {
@Override
public void step1(
//在线过程1
)
@Override
public void step2() {
//在线过程2
}
}
Activity类定义了生命周期的各种回调:
final void performCreate(Bundle icicle) {
...
onCreate(icicle)
...
}
final void performStart() {
...
onStart();
...
}
final void performResume() {
...
onResume();
...
}
protected void onCreate(@Nullable Bundle savedInstanceState);
protected void onStart();
protected void onResume();
perform**()
系列方法分别调用了对应的on**()
方法,目标方法在调用子类重写的方法时通常做了很多额外准备工作和后续工作。
view绘制的整体过程:三大阶段是固定的,子类完成各个部分细节。 同Activity一样:
public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
...
onMeasure(widthMeasureSpec, heightMeasureSpec);
...
}
public void layout(int l, int t, int r, int b) {
...
onLayout(changed, l, t, r, b);
...
}
public void draw(Canvas canvas) {
...
// Step 3, draw the content
if (!dirtyOpaque) onDraw(canvas);
...
}
ViewGroup在方法dispatchTouchEvent()中定义了事件分发机制的整体结构。 子类需要重写以下方法来定制事件处理过程:
public boolean onInterceptTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent event);
把公共不变的行为抽取到基类。 一方面是基类代码复用,另一方面,基类定义了整体结构,而细节只能是子类去完成的操作。 模板方法强调抽象过程的不变性,某些细节的可变性。