一句话总结:
模板模式就像「烹饪食谱」—— 定义做菜的标准流程(煮水、下面、调味),具体放什么调料由子类决定,Android 里的 Activity 生命周期、AsyncTask 都用它规范流程,灵活定制!
一、模板模式的核心思想
核心要素:
- 抽象模板类:定义算法骨架(如
Activity的生命周期流程) - 具体子类:实现某些步骤的具体逻辑(如
MainActivity的onCreate())
类比场景:
- 食谱模板:煮面流程固定为「烧水 → 下面 → 调味 → 出锅」
- 具体实现:番茄鸡蛋面和老坛酸菜面的调味步骤不同
二、Android 源码中的模板模式案例
1. Activity 的生命周期管理
源码实现:
// 模板类:Activity 定义生命周期骨架
public class Activity {
// 模板方法:整个生命周期流程
final void performCreate(Bundle savedInstanceState) {
onCreate(savedInstanceState); // 抽象方法,子类实现
mActivityTransitionState.readState(savedInstanceState);
}
// 抽象步骤(子类必须实现)
protected void onCreate(@Nullable Bundle savedInstanceState) { /* 空实现 */ }
// 钩子方法(子类可选覆盖)
public void onContentChanged() { /* 空实现 */ }
}
// 具体子类:MainActivity 实现具体步骤
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 具体实现
}
}
底层流程:
ActivityThread.handleLaunchActivity()
→ Instrumentation.callActivityOnCreate()
→ Activity.performCreate()
→ MainActivity.onCreate()
2. AsyncTask 的异步任务模板
源码结构:
// 抽象模板类
public abstract class AsyncTask<Params, Progress, Result> {
// 模板方法:执行任务的标准流程
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
return executeOnExecutor(sDefaultExecutor, params);
}
// 步骤1:后台执行(子类必须实现)
protected abstract Result doInBackground(Params... params);
// 步骤2:进度更新(钩子方法)
protected void onProgressUpdate(Progress... values) {}
// 步骤3:结果处理(钩子方法)
protected void onPostExecute(Result result) {}
}
// 具体子类使用
new AsyncTask<Void, Integer, String>() {
@Override
protected String doInBackground(Void... voids) {
// 后台执行下载
return downloadData();
}
@Override
protected void onPostExecute(String result) {
// 更新 UI
textView.setText(result);
}
}.execute();
设计亮点:
- 自动处理线程切换(主线程 → 后台线程 → 主线程)
- 标准化异步任务流程
三、模板模式的底层优势
1. 流程固化与扩展性平衡
- 固化流程:
Activity生命周期顺序不可变(onCreate → onStart → onResume) - 扩展灵活:子类可自由实现各生命周期方法
2. 代码复用与规范
- 复用公共逻辑:如
Activity中Window的初始化
// Activity 的公共初始化
final void attach(Context context, ...) {
mWindow = new PhoneWindow(this); // 创建 Window
mWindow.setWindowManager(...);
}
3. 钩子方法的灵活控制
- 可选覆盖:如
onContentChanged()用于布局变化监听
// 子类可选择是否监听布局变化
@Override
public void onContentChanged() {
Toast.makeText(this, "布局变化了!", Toast.LENGTH_SHORT).show();
}
四、模板模式在开源框架中的应用
1. Retrofit 的 Callback 模板
// 定义回调模板
public interface Callback<T> {
void onResponse(Call<T> call, Response<T> response); // 必须实现
void onFailure(Call<T> call, Throwable t); // 必须实现
}
// 具体实现类
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
// 处理成功响应
}
@Override
public void onFailure(Call<User> call, Throwable t) {
// 处理失败
}
});
2. RecyclerView.Adapter 的数据绑定模板
// 模板方法定义数据绑定流程
public abstract class Adapter<VH extends ViewHolder> {
public abstract void onBindViewHolder(VH holder, int position);
// 公共逻辑:item 数量变化通知
public final void notifyDataSetChanged() {
mObservable.notifyChanged();
}
}
五、模板模式与相似模式对比
| 模式 | 核心区别 | Android 案例 |
|---|---|---|
| 模板模式 | 父类控制流程,子类实现步骤 | Activity 生命周期 |
| 策略模式 | 动态替换完整算法 | LayoutManager 切换布局策略 |
| 工厂方法模式 | 创建对象,不涉及流程控制 | BitmapFactory 创建图片对象 |
六、总结与最佳实践
使用场景口诀
「流程固定步骤多,各步实现可不同
Activity 生命周期,AsyncTask 异步控
最佳实践
- 合理拆分步骤:抽象方法(必须实现)与钩子方法(可选覆盖)
- 避免过度抽象:非必要不增加模板层级
- 结合其他模式:如用工厂模式生成具体步骤实例
注意事项
- 继承带来的耦合:考虑用组合代替继承(如
LifecycleObserver观察生命周期) - 模板方法不宜过多:防止父类过于臃肿
- 线程安全:如
AsyncTask已废弃,推荐改用Kotlin 协程或Executor
源码对照表:
| 场景 | 模板类 | 具体步骤方法 |
|---|---|---|
| 生命周期管理 | Activity | onCreate()、onStart() |
| 异步任务 | AsyncTask | doInBackground() |
| 列表数据绑定 | RecyclerView.Adapter | onBindViewHolder() |
总结口诀:
「模板模式定流程,父类骨架固结构
子类实现各步骤,Activity 生命周期优
钩子方法灵活控,AsyncTask 异步牛