【设计模式与Android】模板方法模式——照葫芦画瓢

什么是模板方法模式

网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了乌尔禾免费建站欢迎大家使用!

 

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

 

模板方法模式的实现方式

 

模板方法模式实际上时封装了一个固定流(tao)程(lu),第一步做什么,第二步做什么都已经在抽象类中定义好,子类只需要在框架不被修改的情况下实现某些步骤的算法替换。

 

当代小说网站的男频爽文,都是有一定套路的,开篇都是一个loser,然后意外获得秘笈,接下来修仙,最后成为宇宙霸主。我相信epubit的读者是不会读这些给识字不多的人读的书的,因此我要拿《红楼梦》中的“掰谎记”举例,贾母对某一类文学作品的套路的总结:

public abstract classTemplate {

    abstractString getTemplateName();

    abstract booleanisChancellor();

    abstractString getHeroineName();

    abstractString getHeroName();

    // 开口都是书香门第
    protected voidscholarlyFamily(){
        Log.e(getTemplateName()," 书香门第");
    }

    // 父亲不是尚书就是宰相
    protected voidfather(){
        Log.e(getTemplateName()," 父亲是"+(isChancellor()?"宰相":"尚书"));
    };

    // 生一个×××必是爱如珍宝
    protected voiddaughter(){
        Log.e(getTemplateName()," 生一个×××("+getHeroineName()+")爱如珍宝");
    }

    // 这×××必是通文知礼,无所不晓,竟是个绝代佳人
    protected voidmarvelOfBeauty(){
        Log.e(getTemplateName()," "+getHeroineName()+"通文知礼,无所不晓,竟是个绝代佳人");
    }

    // 只一见了一个清俊的男人,不管是亲是友,便想起终身大事来
    protected voidmarriage(){
        Log.e(getTemplateName()," 一见了一个清俊的男人("+getHeroName()+")便想起终身大事来");
    }

    // 父母也忘了,书礼也忘了,鬼不成鬼,贼不成贼
    protected voidforget(){
        Log.e(getTemplateName()," "+getHeroineName()+"父母也忘了,书礼也忘了,鬼不成鬼,贼不成贼");
    }

    /**
     * 这个模(tao)板(lu)必须final
     */
    public final voidplay(){
        scholarlyFamily();
        father();
        daughter();
        marvelOfBeauty();
        marriage();
        forget();
    }

}

 

被贾母掰谎的作品《凤求凰》:

public classCourtshipextendsTemplate{

    @Override
    String getTemplateName() {
        return"《凤求凰》";
    }

    @Override
    booleanisChancellor() {
        return false;
    }

    @Override
    String getHeroineName() {
        return"李雏鸾";
    }

    @Override
    String getHeroName() {
        return"王熙凤";
    }

    /**
     * 女主角父亲既不是尚书也不是宰相
     */
    protected voidfather(){
        Log.e(getTemplateName(),"这庄上有个乡绅,姓李");
    }
}

 

类似的作品《西厢记》:

public classWesternChamberextendsTemplate{
    @Override
    String getTemplateName() {
        return"《西厢记》";
    }

    @Override
    booleanisChancellor() {
        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)重构时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

 

需要注意的几个问题

 

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


名称栏目:【设计模式与Android】模板方法模式——照葫芦画瓢
转载来于:http://scyanting.com/article/pdsedd.html