设计模式:模板方法


模板方法

使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。

代码解释

可以联想在线电子邮件和普通邮递的区别。 基类定义操作过程的整体结构:

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);

用途

把公共不变的行为抽取到基类。 一方面是基类代码复用,另一方面,基类定义了整体结构,而细节只能是子类去完成的操作。 模板方法强调抽象过程的不变性,某些细节的可变性。

优质内容筛选与推荐>>
1、WC2019 全国模拟赛第一场 T1 题解
2、定义无图片时显示默认图片,大小
3、vim快捷键
4、Master Item的主要属性
5、comparator and comparable


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号