当一些执行的流程是固定的,但是执行的具体细节不一样,这时候就需要用到模板方法模式
定义:
定义一个操作中的算法的框架,而将一些步骤延迟到子类中实现,使得子类在不改变算法的结构的情况下,又能具体的定义某个算法实现的细节。
实现起来很简单,就是有一个父类,比如里面定义了stepOne()、stepTwo()、stepThree()等方法,然后有一个execute()方法(可以定义为final避免子类覆盖),execute里面按照需要的顺序调用了上面的这些方法。
而在子类中,如果某个方法比如stepTwo,不同的子类实现方式一样,我们在子类中去覆盖重写就好了。
例子:
有一个父类 AbstractComputer,开机方法startUp,里面按照顺序调用了powerOn、checkHardware、loadOS、login方法。
我们知道,个人计算机和军用计算机在checkHardware、loadOS、login方法具体实现的细节可能是不一样的。
我们创建两个子类CoderComputer和MilitaryComputer,然后覆盖具体方法。
Android源码用的模板方法模式
AsyncTask其实就是一个典型的模板方法,调用execute后,会一次执行onPreExecute、doInBackground、onPostExecute也可以通过onProgressUpdate来更新进度。
这几个方法的调用流程和进程的切换是Android源码中定义好了的,而这几个方法的具体实现需要用户自己去实现。
总结
优点:
封装了不变的部分,扩展可变部分
提取公共部分代码,便于维护
缺点:
可能带来代码阅读的难度,有些地方用户难于理解