模板模式

  • 定义:
    定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
  • UML:


    image.png
  • 模型:泡茶与泡咖啡。
    泡茶的算法骨架:水烧开-冲泡茶叶-把茶水倒入杯子-加柠檬
    泡咖啡的算法骨架:水烧开-冲泡咖啡粉-把咖啡倒入杯子-加糖和牛奶
    我们抽象出制作热饮的步骤:


    image.png
public abstract class HotDrink {
    //步骤是固定的,所以用final修饰,不允许改变
    public final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    //这一步是固定的,所以用final修饰,不允许改变
    public final void boilWater() {
        System.out.println("烧水");
    }
    private final void pourInCup() {
        System.out.println("倒进杯子中");
    }
    protected abstract void brew();
    protected abstract void addCondiments();
}
//咖啡对象
public class Coffee extends HotDrink {
    @Override
    protected void brew() {
        System.out.println("冲泡咖啡");
    }
    @Override
    protected void addCondiments() {
        System.out.println("添加糖和牛奶");
    }
}
//茶对象
public class Tea extends HotDrink {
    @Override
    protected void brew() {
        System.out.println("冲泡茶叶");
    }
    @Override
    protected void addCondiments() {
        System.out.println("添加柠檬");
    }
}

使用方式:

public class MainTest {
    public static void main(String[] agrs){
        HotDrink coffee = new Coffee();
        HotDrink tea = new Tea();
        coffee.prepareRecipe();
        tea.prepareRecipe();
    }
}

运行结果:


image.png

通过抽象出模板模式,子类复用了超类中固定的部分,不同的子类中只需定义算法细节,就能实现不同的扩展,例如我们如果想加一种奶茶的热饮,只需要继承HotDrink,再实现冲泡奶茶,加珍珠这两步即可。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容