什么是模板方法模式

 

所谓模板方法模式,就是定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

 

模板方法模式的实现方式

 

模板方法模式实际上时封装了一个固定流(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)重构时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

 

需要注意的几个问题

 

模板方法模式会带来代码阅读的难度。


更多相关文章

  1. Android多点触控实现图片缩放预览
  2. 【设计模式与Android】策略模式——锦囊里的上策中策下策
  3. react-native Android截屏长图
  4. TextView在显示文字的时候有个问题就是一行还没显示满就跳到下一
  5. Android中的Cursor到底是什么?如何理解Cursor的方法都在做什么事
  6. Android(安卓)Volley完全解析(四),带你从源码的角度理解Volley
  7. Android(安卓)中View的绘制流程(结合图解及伪代码说明)
  8. 增加 Andorid手機電池續航力 ,一定有效的省電心得
  9. Android(安卓)Google Map API使用的八个步骤

随机推荐

  1. SQL Server中存储过程比直接运行SQL语句
  2. oracle基础知识总结 part 3 : 三范式,PLSQL
  3. Unable to use slave's temporary direct
  4. CentOS下MySQL的安装和修改用户密码
  5. SQL View查找缺失值,应该很简单
  6. 更大的舞台在等你
  7. sql server查看表空间
  8. 条件复杂的sql语句查询
  9. 根据(var2) (var3) (var3)极限X (var3)对
  10. 条件SQL选择-当返回集为空时,执行另一个选