模板方法模式

模板方法模式

使命

模板方法(Template Method Pattern)简单来说和抽象类继承雷同,需要注意的点是,模板方法抽象类定义了部分抽象方法,由子类实现,子类的执行结果影响父类的结果,也就是子类对父类产生了影响

优点
  • 封装不变部分,拓展可变部分
  • 提取公共代码,便于维护
  • 行为由父类控制,子类实现
缺点
  • 和继承的思想有点颠倒

继工厂模式后,我们知道现有一个造汽车的工厂,能量产各种汽车,而这些汽车是怎么生产的呢?结合实际来看,其实每辆车都是基于某个平台来生产的,而这种平台我们称之为模板,来看看例子。

奔驰汽车生产平台(模板)

public abstract class Benz {

    public abstract void start();

    public abstract boolean isTurbo();

    public abstract void turboSound();

    public void run(){
        this.start();
        if (isTurbo()){
            this.turboSound();
        }
    }
}

C200

public class C200 extends Benz {

    @Override
    public void start() {
        System.out.println("C200 开始启动啦");
    }

    @Override
    public boolean isTurbo() {
        return true;
    }

    @Override
    public void turboSound() {
        System.out.println("C200 涡轮声,wow,wow,wow......");
    }
}

CLA

public class CLA extends Benz {

    @Override
    public void start() {
        System.out.println("CLA 启动啦");
    }

    @Override
    public boolean isTurbo() {
        return false;
    }

    @Override
    public void turboSound() {

    }
}

开始生产

public class Client {
    public static void main(String[] args) {
        C200 c200 = new C200();
        c200.run();

        CLA cla = new CLA();
        cla.run();
    }
}

整个例子看起来并不复杂,甚至可以说就是简单的继承的做法,从这个例子可以看出子类的实现可以改变父类的模板方法执行结果,我们称isTurbo这种类型的方法为钩子方法(Hook Method),有了钩子方法的模板方法才算完美。