java-设计模式之模板模式

模板模式

 

抽象基类:

package templateFactory;
/**
 * @program: designPattern
 * @description: 抽象基类,为所有的子类提供一个算法框架
 * @author: Mr.Zhang
 * @create: 2020-08-04 17:06
 * 提神饮料
 **/
public abstract class RefreshBeverage {

    //使用抽象基类定义框架,而禁止所有的子类改变算法框架
    /**
     * 制备饮料的模板方法
     * 封装了所有子类共同遵循的算法框架
     **/
    public final void prepareBeverageTemplate(){
        //1.将水煮沸
        boilWater();
        //2.泡制饮料
        brew();
        //3.将饮料倒入杯中
        pourInCup();

        if(isCustomerWantsCodiments()){
            //4.加入调料
            addCondiments();
        }
    }
    //询问用户是否加入调料
    //Hook,钩子函数,提供一个默认或空的实现
    //具体的子类可以自行决定是否挂钩以及如何挂钩
    protected boolean isCustomerWantsCodiments() {
        return true;
    }
    //对于子类来说是共同的方法
    private void boilWater(){
        System.out.println("将水煮沸");
    }
    //抽象方法,不需要实现
    protected abstract void brew();
    private void pourInCup(){
        System.out.println("将饮料倒入杯中");
    }
    //抽象方法,不需要实现,由子类实现
    protected abstract void addCondiments();

}

子类Coffee实现:

java-设计模式之模板模式

子类Tea实现:

java-设计模式之模板模式

测试类:

java-设计模式之模板模式

运行结果:

java-设计模式之模板模式

模板总结:

实现要素:从类的角度看 1.抽象基类 2.具体子类

抽象基类:有相同的,有共性的方法,比如下面的基本方法,则再基类中定义并实现

java-设计模式之模板模式

抽象方法:

只知道具体原则,而不知道抽象细节的方法,需要延迟到子类中实现

java-设计模式之模板模式

可选的钩子:只在基类中提供,默认为空的实现

java-设计模式之模板模式

Template方法:

将基本方法和抽象方法、钩子方法按照业务逻辑要求汇总而成形成模板方法

方法声明为final,使该方法不能被子类复写,需要遵循一个原则:子类可以替换掉父类中的可变逻辑,但不能改变整体逻辑结构。

java-设计模式之模板模式

 

2.具体子类:

1.需要实现基类中的抽象方法,以提供哪些具体个性化的实现

java-设计模式之模板模式

2.在子类中可选的覆盖钩子方法,来更加个性化的影响算法的局部行为

java-设计模式之模板模式

也可以不复写父类的钩子方法:

java-设计模式之模板模式

java-设计模式之模板模式

java-设计模式之模板模式

java-设计模式之模板模式

java-设计模式之模板模式

java-设计模式之模板模式

一个类只能extends一个类,而不能继承多个父类。