Android源码看设计模式(十九)--------关于模板模式的相关分析

模板模式

定义:

定义一个操作中的算法的框架,将一些步骤在子类中实现,使得子类可以比改变一个算法的结构即可以冲定义该算法中的某些特定步骤

使用场景

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

模板模式的写法

UML图如下:
这里写图片描述

  • AbstractClass:抽象类,定义一套算法框架
  • ConcreteClass :具体实现类

参考http://liuwangshu.cn/designpatterns/9-templatemethod%20.html文中的例子,以武侠小说中高手决斗时出手的过程来说明:

  1. 开启经脉
  2. 运使内功
  3. 出招

定义AbstractClass:算法框架,就是出手的框架

public abstract class AbstractKungFu {
    //防止算法框架被重写
    public final void fighting() {
        //开启经脉,具体方法,也可调整
        jingmai();
        //运使内功,抽象方法
        neigong();
        //钩子方法,判断是否有武器
        if (haveWeapons()) {
            weapons();
        }

    }
    //经脉
    protected void jingmai() {
        System.out.println("开始手少阳三经");
    };
    //内功
    protected abstract void neigong();
    //招式
    protected abstract void zhaoshi();
    //武器
    protected abstract void weapons();
    //钩子方法,空实现,子类可重写可不重写
    protected void hook(){};

    //判断时候有武器
    public boolean haveWeapons() {
        return true;
    }
}

具体实现类:张三丰、张无忌

//张三丰
public class Zhangsanfeng extends AbstractKungFu {
    //内功
    @Override
    protected void neigong() {
        System.out.println("先天功");
    }
    //招式
    @Override
    protected void zhaoshi() {
        System.out.println("太极剑");
    }
    //武器
    @Override
    protected void weapons() {
        System.out.println("真武剑");
    }

    //自定义实现钩子方法
    @Override
    protected void hook() {
        System.out.println("不想打了");
    }
}


//张无忌
public class Zhangwuji extends AbstractKungFu {
    //内功
    @Override
    protected void neigong() {
        System.out.println("九阳神功");
    }

    //经脉
    @Override
    protected void jingmai() {
        System.out.println("足少阴胆经");
    }

    //招式
    @Override
    protected void zhaoshi() {
        System.out.println("七伤拳");
    }

    @Override
    protected void weapons() {
    }

    //不使用武器
    @Override
    public boolean haveWeapons() {
        return false;
    }
}

以上就是模板模式的本质了,所谓钩子方法有如下两种类型:

  1. 提供空实现,由子类决定是否覆盖,如上面的hook方法
  2. 返回类型通常是bool类型,用作条件判断,如上面的武器条件判断

Android中常见的模板方法应用

  1. 最常见的就是Activity的生命周期,此创建到现实,这个过程,无论那个界面都会执行相同方法,但是其中具体的内容却是不一样的,这就是典型的模板模式
  2. AsyncTask也是比较典型的模板模式类型,其执行的算法框架是固定的,调用execute之后,会依次执行onPreExecute,doInbackground,onPostExecute也可以通过onProcessUpdate来更新进度,耗时操作是在doInbackground中,一些初始化的操作是在onPreExecute方法中

Android源码设计模式解析与实战
http://liuwangshu.cn/designpatterns/9-templatemethod%20.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值