模板方法模式

来源:互联网 发布:网络dns错误怎么办 编辑:程序博客网 时间:2024/05/29 09:41

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使用子类可以在不改变算法的结构情况下,重新定义算法的某些步骤。

这里写图片描述

下面我们以沏茶和泡咖啡为例,来说明模板方法模式。

沏茶或者泡咖啡的流程类似,分为以下四步:

  1. 把水煮沸
  2. 泡茶或者咖啡
  3. 将饮料倒进杯子
  4. 添加调料

其中,第二步和第四步根据对象的不同,会有所区别。所有这两个方法可以交由子类去实现。代码如下:

一、抽象饮料模板

public abstract class AbstractBeverageTemplate {    void prepareRecipe(){        //把水煮沸        boilWater();        //泡茶或者咖啡        brew();        //把饮料倒进杯子        pourInCup();        //钩子方法子类可以重写来选择是否添加调料        if(customerWantsCondiments()){            addCondiments();        }    }    abstract void brew();    abstract void addCondiments();    public void boilWater(){        System.out.println("Bolling water");    }    public void pourInCup(){        System.out.println("Pouring into cup");    }    /**     * 钩子方法,是否添加调料,默认为false     * @return     */    public boolean customerWantsCondiments(){        return false;    }}

2. 咖啡

public class CoffeeWithHook extends AbstractBeverageTemplate{    @Override    void brew() {        System.out.println("Dripping Coffee through flter");    }    @Override    void addCondiments() {        System.out.println("Adding Suger and Milk");    }    @Override    public boolean customerWantsCondiments() {        return true;    }}

3. 茶

public class TeaWithOutHook extends AbstractBeverageTemplate {    @Override    void brew() {        System.out.println("Steeping the tea");    }    @Override    void addCondiments() {        System.out.println("Adding Lemon");    }}

5. 测试

public class TemplateTest {    public static void main(String[] args) {        AbstractBeverageTemplate tea = new TeaWithOutHook();        AbstractBeverageTemplate coffee = new CoffeeWithHook();        tea.prepareRecipe();        System.out.println("-------------------------------");        coffee.prepareRecipe();    }}

6. 运行结果

Bolling waterSteeping the teaPouring into cup-------------------------------Bolling waterDripping Coffee through flterPouring into cupAdding Suger and Milk