什么是模板方法模式
所谓模板方法模式,就是定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式的实现方式
模板方法模式实际上时封装了一个固定流(tao)程(lu),第一步做什么,第二步做什么都已经在抽象类中定义好,子类只需要在框架不被修改的情况下实现某些步骤的算法替换。
当代小说网站的男频爽文,都是有一定套路的,开篇都是一个loser,然后意外获得秘笈,接下来修仙,最后成为宇宙霸主。我相信epubit的读者是不会读这些给识字不多的人读的书的,因此我要拿《红楼梦》中的"掰谎记"举例,贾母对某一类文学作品的套路的总结:
public abstract class Template {
abstract String getTemplateName();
abstract boolean isChancellor();
abstract String getHeroineName();
abstract String getHeroName();
// 开口都是书香门第 protected void scholarlyFamily(){ Log.e(getTemplateName()," 书香门第"); }
// 父亲不是尚书就是宰相 protected void father(){ Log.e(getTemplateName()," 父亲是"+(isChancellor()?"宰相":"尚书")); };
// 生一个×××必是爱如珍宝 protected void daughter(){ Log.e(getTemplateName()," 生一个×××("+getHeroineName()+")爱如珍宝"); }
// 这×××必是通文知礼,无所不晓,竟是个绝代佳人 protected void marvelOfBeauty(){ Log.e(getTemplateName()," "+getHeroineName()+"通文知礼,无所不晓,竟是个绝代佳人"); }
// 只一见了一个清俊的男人,不管是亲是友,便想起终身大事来 protected void marriage(){ Log.e(getTemplateName()," 一见了一个清俊的男人("+getHeroName()+")便想起终身大事来"); }
// 父母也忘了,书礼也忘了,鬼不成鬼,贼不成贼 protected void forget(){ Log.e(getTemplateName()," "+getHeroineName()+"父母也忘了,书礼也忘了,鬼不成鬼,贼不成贼"); }
/** * 这个模(tao)板(lu)必须final */ public final void play(){ scholarlyFamily(); father(); daughter(); marvelOfBeauty(); marriage(); forget(); }
} |
被贾母掰谎的作品《凤求凰》:
public class Courtship extends Template{
@Override String getTemplateName() { return "《凤求凰》"; }
@Override boolean isChancellor() { return false; }
@Override String getHeroineName() { return "李雏鸾"; }
@Override String getHeroName() { return "王熙凤"; }
/** * 女主角父亲既不是尚书也不是宰相 */ protected void father(){ Log.e(getTemplateName(),"这庄上有个乡绅,姓李"); } } |
类似的作品《西厢记》:
public class WesternChamber extends Template{ @Override String getTemplateName() { return "《西厢记》"; }
@Override boolean isChancellor() { return true; }
@Override String getHeroineName() { return "崔莺莺"; }
@Override String getHeroName() { return "张君瑞"; } } |
贾母过了一个开心的元宵节,读者们也学会了模板方法模式。
Android源码中的模板方法模式
(1)AsyncTask
用户可以根据需求重写onPreExecute、doInBackground、onPostExecute这个逻辑流程,这是典型的模板方法模式。
(2)生命周期
无论Activity、Service还是Fragment,一切以"on"打头的被动方法都是模板方法模式的一部分。
Android开发中如何利用模板方法模式
模板方法模式的优点很明显:
(1)封装不变部分,扩展可变部分
(2)提取公共部分代码,便于维护。
因此适用于以下场合:
(1)多个子类有公有的方法,并且逻辑基本相同时。
(2)重复、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
(3)重构时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
需要注意的几个问题
模板方法模式会带来代码阅读的难度。