博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式的理解和使用
阅读量:4550 次
发布时间:2019-06-08

本文共 1783 字,大约阅读时间需要 5 分钟。

一、是什么

1. 定义: 在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中实现

2. 好处:

  代码复用,  对于某些算法的实现时,很有效,确定了整体的架子,让子类去实现具体的步骤

二、示例

1. 代码背景:

  • 制作茶的步骤是:
    • 1. 把水煮沸
    • 2.用沸水浸泡茶叶
    • 3. 把冲泡的倒进杯子
    • 4. 加柠檬
  • 制作咖啡的步骤:
    • 1. 把水煮沸
    • 2. 冲泡 
    • 3. 把冲泡的倒进杯子
    • 4. 加糖和牛奶

比较发现 1. 3步骤是很相似的,2,4步骤不同,所以我们可以提取中抽象类

2. 饮料制作抽象类,定义冲泡的步骤

prepareBecipe()方法将冲泡的步骤定义好了,有些具体的步骤的实现交给子类去做,这里用final关键字,告诉别人,我的步骤已经定了,你们别改
/** * 饮料制作 */public abstract class CaffeineBeverage {    /**     * 准备饮料 设置这个方法不更改     */    public final void prepareBecipe() {        // 1.把水煮沸        boilWater();        // 2. 泡: 将具体实现延迟到子类中        brew();        // 3. 把茶倒进杯子        pourInCup();        // 4. 加调料: 将具体实现延迟到子类中        addCondiments();    }    /**     * 2. 泡     */    abstract void brew();    /**     * 4. 加调料     */    abstract void addCondiments();    void boilWater() {        System.out.println("把水煮沸");    }    void pourInCup() {        System.out.println("把冲泡的倒进杯子");    }}

3. 定义茶、咖啡子类

/** * 泡茶 */public class Tea extends CaffeineBeverage {    @Override    void brew() {        System.out.println("用沸水冲茶叶");    }    @Override    void addCondiments() {        System.out.println("加柠檬");    }}/** * 咖啡 */public class Coffee extends CaffeineBeverage{    @Override    void brew() {        System.out.println("用沸水冲泡咖啡");    }    @Override    void addCondiments() {        System.out.println("加糖和牛奶");    }}

4. 测试类

/** * 测试类 */public class Main {    public static void main(String[] args) {        Tea tea = new Tea();        tea.prepareBecipe();        System.out.println("=====================================");        Coffee coffee = new Coffee();        coffee.prepareBecipe();    }}// 控制台显示把水煮沸用沸水冲茶叶把冲泡的倒进杯子加柠檬=====================================把水煮沸用沸水冲泡咖啡把冲泡的倒进杯子加糖和牛奶

三、总结

1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。

2)使用的是继承

转载于:https://www.cnblogs.com/milicool/p/11278618.html

你可能感兴趣的文章
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
使用最快的方法计算2的16次方是多少?
查看>>
urllib 中的异常处理
查看>>
【SQL Server高可用性】高可用性概述
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
SQL优化:重新编译存储过程和表
查看>>
PCB“有铅”工艺将何去何从?
查看>>
Solr环境搭建
查看>>
ASP.NET的URL过滤
查看>>
自己写的Web服务器
查看>>
自定义定时组件
查看>>
2-素数打比表
查看>>
性能测试
查看>>
浅谈 Python 的 with 语句
查看>>
使用koa+angular+mysql 完成了一个企业站
查看>>
SQL使用范例
查看>>
转 SQL集合函数中利用case when then 技巧
查看>>
WEB ICON 的探讨
查看>>