首页 > 技术文章 > 8、模板方法模式

use-D 2018-10-08 21:42 原文

模板方法模式定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法是的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
  • 模板方法定义了算法的实现步骤,把这些步骤放在子类中实现;
  • 模板方法为我们提供了代码复用的重要技术;
  • 模板方法的抽象类可以定义具体方法;
  • 抽象方法由子类实现;
  • 钩子方法在抽闲类中不做任何事,或者只做默认的事,子类可以选择要不要覆盖钩子方法;
  • 为了防止子类改变模板方法,可以将模板方法为final;
  • 策略模式和模板方法模式都是封装算法,一个用组合方式,后一个用继承方式;
定义模板抽象类,其中prepare方法定义了模板的执行顺序,子类可以实现各自的方法,但是必须使用prepare模板方法执行;
public abstract class CoffeineBeverage {
    /**
     * 定义各个方法的执行顺序
     */
    final void prepare() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    /**
     *把水煮沸
     */
    public abstract void boilWater();

    /**
     * 用水冲
     */
    public abstract void brew();

    /**
     *把饮料倒入杯中
     */
    public void pourInCup() {
        System.out.println("把饮料倒入杯中");
    };

    /**
     *加适当调料
     */
    public abstract void addCondiments();
}
茶类,继承CoffeineBeverage类,实现prepare模板方法中定义的具体步骤方法;
public class Tea extends CoffeineBeverage {
    @Override
    public void boilWater() {
        System.out.println("Tea 把水煮沸");
    }

    @Override
    public void brew() {
        System.out.println("Tea 用水冲");
    }

    @Override
    public void addCondiments() {
        System.out.println("Tea 加适当调料");
    }
}
咖啡类,继承CoffeineBeverage类,实现prepare模板方法中定义的具体步骤方法;
public class Coffee extends CoffeineBeverage {
    @Override
    public void boilWater() {
        System.out.println("Coffee 把水煮沸");
    }

    @Override
    public void brew() {
        System.out.println("Coffee 用水冲");
    }

    @Override
    public void addCondiments() {
        System.out.println("Coffee 加适当调料");
    }
}
测试类:
public class Test {
    public static void main(String[] args){
        CoffeineBeverage tea = new Tea();
        tea.prepare();
        CoffeineBeverage coffee = new Coffee();
        coffee.prepare();
    }
}

执行结果:

Tea 把水煮沸
Tea 用水冲
把饮料倒入杯中
Tea 加适当调料


Coffee 把水煮沸
Coffee 用水冲
把饮料倒入杯中
Coffee 加适当调料

推荐阅读