简单的总结下模板方法设计模式,其实这个模式我们在开发中一直在使用,只不过没有把它提出来叫模板方法模式,习以为常的东西往往被我们忽略.下面简单举例子说明下这个设计模式.
我们拿画画来举例,很多时候我们画的画的背景是相同的,比如是天空,是草原,是大海,等等.有些又是不同的,比如草原上可能跑着一匹马,也可能跑着一群狼,那么,模板就出现了.在几幅画中相同的部分我们可以抽取出来,不同的部分谁去画谁就去按照自己的需求去画出来,这样做的目的就是提高了效率,放在程序上来说就是降低了耦合.
先用一张图片来介绍下模板方法设计模式:
这张图经常出现在介绍模板方法设计模式的资料中,简单的说就是定义了一个基类(一般都是抽象类),在这个基类里面定义了一些方法,需要子类去实现的方法就声明成抽象的,如果这个方法子类实现都是一样的,则这个方法就是非抽象的.
代码举例:
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里面的抽象方法,这几个方法需要子类去实现
名词解释不重要,关键是去理解!