Head First设计模式笔记(模板方法模式)

来源:互联网 发布:qq显示网络状态准确吗 编辑:程序博客网 时间:2024/05/23 01:25

在研究模板模式之前,先看2段代码
1.

public class Coffee {    void prepareRecipe(){        boilWater();        brewCoffeeGrinds();        pourInCup();        addSugarAndMilk();    }    public void boilWater(){        System.out.println("boiling water...");    }    public void brewCoffeeGrinds(){        System.out.println("dripping coffee through filter");    }    public void pourInCup(){        System.out.println("pouring into cup");    }    public void addSugarAndMilk(){        System.out.println("adding sugar and milk");    }}

2.

public class Tea {    void prepareRecipe(){        boilWater();        steepTeaBag();        pourInCup();        addLemon();    }    public void boilWater(){        System.out.println("boiling water...");    }    public void steepTeaBag(){        System.out.println("steeping the tea...");    }    public void addLemon(){        System.out.println("adding lemon...");    }    public void pourInCup(){        System.out.println("Pouring into cup...");    }}

我们可以看出上面2段代码很类似,但是确不是完全一样
下面我们来看看模板方法的定义
模板方式:定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤

public abstract class CaffeeineBeverage {    final void prepareRecipe(){        boilWater();        brew();        pourInCup();        addCondiments();    }    void boilWater() {        System.out.println("boiing water...");    }    //不一样的部分做成抽象类,等待子类去实现    abstract void brew();    abstract void addCondiments();    void pourInCup(){        System.out.println("pouring into cup...");    }}

写一个超类,公用的方法放在超类中实现,不同的方法做成抽象类,以便子类来实现

public class Coffee extends CaffeeineBeverage{    @Override    void brew() {        System.out.println("driping coffee through filter...");    }    @Override    void addCondiments() {        System.out.println("adding sugar and milk");    }}

如果是有的方法在子类中可以实现也可以不实现的话,在超类中可以做一个钩子,模板模式也是比较简单,但在实际使用的过程中,一定要注意步骤拆分的粒度,不要拆分的太细,太细导致子类要实现的东西较多,太粗的话,又达不到效果,因此要更加实际的情况有效的拆分

阅读全文
0 0
原创粉丝点击