模版模式-Template Pattern

父类定义方法的前置和后置处理,子类只需要去实现具体的方法逻辑即可
父类为抽象类或普通类,模版方法用final修饰,不用子类去覆盖

  • 应用场景:不同的业务流程中,只有其中一个步骤不同,其他都相同的场景

1. Demo

package com.design.pattern.day01;

public class Demo05 {
    public static void main(String[] args) {
        CoffeeMaker americanoCoffeeMaker = new AmericanoCoffeeMaker();
        americanoCoffeeMaker.makeCoffee();
        System.out.println("==============");
        CoffeeMaker latteCoffeeMaker = new LatteCoffeeMaker();
        latteCoffeeMaker.makeCoffee();
        System.out.println("==============");

        CoffeeMaker espresso = new CoffeeMaker() {
            @Override
            public void prepareCup() {
                System.out.println("espresso coffee cup ready");
            }

            @Override
            public void addCoffeeBean() {
                System.out.println("espresso coffee cup ready");
            }
        };
        espresso.makeCoffee();
    }
}

class LatteCoffeeMaker extends CoffeeMaker {

    @Override
    public void prepareCup() {
        System.out.println("latte coffee cup ready");
    }

    @Override
    public void addCoffeeBean() {
        System.out.println("latte coffee bean ready");
    }
}

class AmericanoCoffeeMaker extends CoffeeMaker {

    @Override
    public void prepareCup() {
        System.out.println("americano coffee cup ready");
    }

    @Override
    public void addCoffeeBean() {
        System.out.println("americano coffee bean ready");
    }
}

abstract class CoffeeMaker {
    /**
     * 模版方法
     * 1. 程序结构由父类控制; 可以做一些前处理及后处理
     * 2. final 不允许被重写
     * 3. 具体的业务逻辑由子类来实现
     */
    public final void makeCoffee() {
        prepareCup();
        addWater();
        addCoffeeBean();
    }

    // 确定的方法自己实现
    private void addWater() {
        System.out.println("add water");
    }

    // 不确定的方法子类实现
    public abstract void prepareCup();

    public abstract void addCoffeeBean();
}

2. 钩子函数

abstract class CoffeeMaker {
    /**
     * 模版方法
     * 1. 程序结构由父类控制; 可以做一些前处理及后处理
     * 2. final 不允许被重写
     * 3. 具体的业务逻辑由子类来实现
     */
    public final void makeCoffee() {
        prepareCup();
        addWater();
        addCoffeeBean();
        if (isSoldOut()) {
            soldOutWarning();
        }
    }

    // 确定的方法自己实现
    private void addWater() {
        System.out.println("add water");
    }

    // 不确定的方法子类实现
    public abstract void prepareCup();

    public abstract void addCoffeeBean();

    // 钩子函数: 子类具体去实现具体的值
    public abstract boolean isSoldOut();

    public void soldOutWarning() {
        System.out.println("this kind of coffee sold out");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值