一天一个设计模式---模板方法模式

本文介绍了模板方法模式的基本概念,通过实例展示了如何通过定义算法骨架来减少重复代码,并提供了冲泡热饮的具体应用案例。

介绍:定义一个操作中的算法骨架,将一些步骤延迟到子类中。准备一个抽模板,实现部分逻辑,再声明一些对于子类需要不同实现的公用抽象方法。

场景:对于多个业务,它们的业务中有很多功能是相似的,有部分功能需要独自实现。这样我们就可以使用模板方法模式,将功能打散,抽取出更小的功能块,减小重复代码。

一、角色和作用

角色作用
抽象模板定义子类需要实现的不同功能块,以及子类共用的功能块
具体模板实现各自不同的功能块

二、冲泡热饮

在泡咖啡和泡柠檬绿茶的时候,它们有部分功能是相同的-烧水,倒入杯子。而加的主料和调料是不同的。

热饮

有一个子类无法覆盖的方法prepareRecipe(),用于冲泡饮料的功能

public abstract class Beverage {

    final void prepareRecipe() {
        // final 表示希望子类不能覆盖此方法
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 冲泡内容和添加的配料都由子类来实现
    abstract void brew();

    abstract void addCondiments();

    private void pourInCup() {
        System.out.println("将热饮倒入杯子");
    }

    private void boilWater() {
        System.out.println("烧水");
    }

}

咖啡

// 咖啡的冲泡
public class Coffee extends Beverage {

    @Override
    void brew() {
        System.out.println("添加咖啡");
    }

    @Override
    void addCondiments() {
        System.out.println("添加方糖");
    }

}

柠檬绿茶

// 柠檬绿茶冲泡
public class Tea extends Beverage {

    @Override
    protected void brew() {
        System.out.println("放入茶叶");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入柠檬片");
    }

}

冲泡饮料

    public static void main(String[] args) {
        System.out.println("泡咖啡");
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
        System.out.println("泡柠檬绿茶");
        Beverage tea = new Tea();
        tea.prepareRecipe();
    }

输出

泡咖啡
烧水
添加咖啡
将热饮倒入杯子
添加方糖
泡柠檬绿茶
烧水
放入茶叶
将热饮倒入杯子
加入柠檬片

更多模式: 一天一个设计模式—分类与六大原则

更多源码: https://github.com/oDevilo/Java-Base

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值