模板方法模式

介绍

在面向对象开发过程中,通常会遇到一个这样的问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而变化的。这类问题的解决方案就是模板方式方法。

定义

定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

使用场景

  1. 多个子类有公有的方法,并且逻辑基本相同
  2. 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则有各个子类实现
  3. 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽到父类中,然后通过钩子函数约束其行为。

角色介绍

ABSTemplate 抽象类,定义了一套算法框架,并提供了一个钩子函数,钩子函数中按算法框架的逻辑流程调用各步骤方法,钩子函数是 final 的,保证逻辑流程不能被子类修改,子类只能改变某一步骤中的具体实现,从而保证逻辑流程的稳定性。其中的算法步骤我们称为模板方法。

ConcreteImpl 具体实现类,负责算法框架各个步骤的具体实现

Android 源码中的模板方法

在 Android 中,AsyncTask 是一个比较常用的类,这个类就是用了模板方法模式。使用 AsyncTask 时,我们把耗时方法放入 doInBackground 方法中,在 doInBackground 之前,还可以在 onPreExcute 方法中做一些初始化操作,doInBackground 执行完成后,会执行 onPostExcute 方法。而我们只需要构建 AsyncTask 对象,然后执行 execute 方法即可。可以看到整个过程就是一个框架,具体的实现都需要子类来完成,并且执行的算法框架时固定的。

总结

模板方法用 4 个字概括就是,流程封装。也就是把某个固定的流程封装到一个 final 函数中,并且让子类能够定制这个流程中的某些或所有步骤,这就要求父类提取共用的代码,提升代码的复用率,同时也带来了更好的扩展性。

优点

  1. 封装不变代码,扩展可变部分
  2. 提取公共代码部分,便于维护

缺点

模板方法会带来代码阅读的难度,让用户觉得难以理解

你可能感兴趣的:(模板方法模式)