文章出處

模板方法

使用基類定義整體步驟,即若干方法的調用過程,將一些可變的步驟由子類去重寫。這樣就可以利用多態在不改變操作的整體結構下定制一些特殊細節。

代碼解釋

可以聯想在線電子郵件和普通郵遞的區別。
基類定義操作過程的整體結構:

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

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繪制

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事件分發

ViewGroup在方法dispatchTouchEvent()中定義了事件分發機制的整體結構。
子類需要重寫以下方法來定制事件處理過程:

public boolean onInterceptTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent event);

用途

把公共不變的行為抽取到基類。
一方面是基類代碼復用,另一方面,基類定義了整體結構,而細節只能是子類去完成的操作。
模板方法強調抽象過程的不變性,某些細節的可變性。

(本文使用Atom編寫)


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()