Android设计模式之模板方法模式

简单的总结下模板方法设计模式,其实这个模式我们在开发中一直在使用,只不过没有把它提出来叫模板方法模式,习以为常的东西往往被我们忽略.下面简单举例子说明下这个设计模式.

我们拿画画来举例,很多时候我们画的画的背景是相同的,比如是天空,是草原,是大海,等等.有些又是不同的,比如草原上可能跑着一匹马,也可能跑着一群狼,那么,模板就出现了.在几幅画中相同的部分我们可以抽取出来,不同的部分谁去画谁就去按照自己的需求去画出来,这样做的目的就是提高了效率,放在程序上来说就是降低了耦合.

先用一张图片来介绍下模板方法设计模式:
这里写图片描述
这张图经常出现在介绍模板方法设计模式的资料中,简单的说就是定义了一个基类(一般都是抽象类),在这个基类里面定义了一些方法,需要子类去实现的方法就声明成抽象的,如果这个方法子类实现都是一样的,则这个方法就是非抽象的.

代码举例:

package com.dgtech.template;

/**
 * 以汽车模型举例
 * 生产汽车肯定需要各种各样的模型,不同的汽车有不同的特点,但是又有一些共同点,比如都能启动
 * 下面这个类是汽车模型
 * @author SS
 *
 */
public abstract class CarModel {
    //汽车有自己独特的启动方式,比如用钥匙,语音,或者手机开启,所以这个方法要交给子类去实现
    //如果说只能由子类去实现这个方法,则方法生命权限应该是protected
    protected abstract void start();
    //每种汽车使用燃料的种类,也让子类去实现
    protected abstract void useEnergy();
    //每种汽车都能开动起来,所以这个方法是所有汽车公共的
    public void run(){
        start();
        useEnergy();
    }
}

/**
 * 下面由上面的汽车模型设计第一种汽车
 * @author SS
 *
 */
class DasAuto extends CarModel{

    @Override
    protected void start() {
        System.out.print("用手机启动");

    }

    @Override
    protected void useEnergy() {
        System.out.println("汽油驱动");

    }

}
/**
 * 下面由上面的汽车模型设计第二种汽车
 * @author SS
 *
 */
class Tesla extends CarModel{

    @Override
    protected void start() {
        System.out.print("用语音启动");

    }

    @Override
    protected void useEnergy() {
        System.out.println("电力驱动");

    }

}


主程序中调用:

package com.dgtech.template;

public class NewCar {

    public static void main(String[] args) {
        CarModel dasAuto = new DasAuto();
        dasAuto.run();

        CarModel tesla = new Tesla();
        tesla.run();

    }

}

输出结果:
用手机启动汽油驱动
用语音启动电力驱动

写到这,想起一个名词”控制反转”,一般情况下,子类调用父类的方法我们认为这是正向的调用,当出现父类调用子类的时候,我们可以把这理解为控制反转.

再说一下该设计模式的一些名词:

抽象类:很好理解,就是定义了一些方法,让子类具体去实现,就是代码中的CarModel
具体类:很好理解,继承抽象类,实现里面的抽象方法就成了具体类
模板方法:就是CarModel里面的run()方法,这个方法调用了其他的抽象方法,并安排了其他方法的执行顺序
基本方法:CarModel里面的抽象方法,这几个方法需要子类去实现

名词解释不重要,关键是去理解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值