一句话说透Android里面的模板模式

181 阅读4分钟

一句话总结:
模板模式就像「烹饪食谱」—— 定义做菜的标准流程(煮水、下面、调味),具体放什么调料由子类决定,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 异步控

最佳实践

  1. 合理拆分步骤:抽象方法(必须实现)与钩子方法(可选覆盖)
  2. 避免过度抽象:非必要不增加模板层级
  3. 结合其他模式:如用工厂模式生成具体步骤实例

注意事项

  1. 继承带来的耦合:考虑用组合代替继承(如 LifecycleObserver 观察生命周期)
  2. 模板方法不宜过多:防止父类过于臃肿
  3. 线程安全:如 AsyncTask 已废弃,推荐改用 Kotlin 协程 或 Executor

源码对照表

场景模板类具体步骤方法
生命周期管理ActivityonCreate()onStart()
异步任务AsyncTaskdoInBackground()
列表数据绑定RecyclerView.AdapteronBindViewHolder()

总结口诀
模板模式定流程,父类骨架固结构
子类实现各步骤,Activity 生命周期优
钩子方法灵活控,AsyncTask 异步牛