Java 设计模式 ------ 模板设计模式
模板设计模式主要来源于生活中有一些事情是有模板可以遵循的。举两个生活中的例子,如泡茶和泡咖啡,看一看。
泡茶有以下四个步骤: 1, 烧开水; 2 把茶放到水杯中; 3,倒入开水; 4, 加糖。
泡咖啡也同样有以下四个步骤: 1, 烧开水; 2 把咖啡放到水杯中; 3,倒入开水; 4, 加入糖和牛奶。
这时,可以清楚地发现,无论是泡茶还是泡咖啡,它们的步骤几乎是相同的:1,开水, 2 放入水杯,3 倒入开水,4 加调味剂。只有具体到泡某种饮料时,它们有些步骤才不同,泡茶肯定是要把茶放到水杯中,而泡咖啡是把咖啡放到水杯中。这时我们就可以把相同的步骤提取出来,生成一个模版,进行共用,而到具体的内容时,它们再有具本的实现。 具体到代码时,模版就可以用抽象类实现,具体的内容可以到它的子类中实现。
现在用抽象类把模版代码实现一下,
- // 抽象基类,为所有的子类提供一个模版
- public abstract class Beverage {
- // 具体的模板方法, 要用final关键字进行修饰,避免子类进行修改
- public final void prepareBeverageTemplate() {
- // 1, 烧开水
- boilWater();
- // 2, 放到杯中
- putIntoCup();
- // 加入开水
- addHotWater();
- // 加入调味应有剂
- addCondiments();
- }
- private void boilWater() {
- System.out.println("烧开水");
- }
- protected abstract void putIntoCup();
- private void addHotWater() {
- System.out.println("加水");
- }
- protected abstract void addCondiments();
- }
这里可以看到,在模板中,我们实现了两个方法 boilWater 和 addHotWater,因为这两个方法,对于泡任何饮料来说,都是相同的。另外两个方法则是抽象方法,因为只有到具体泡什么饮料时,这两个方法,才能具体实现,在这里我们并不知道泡茶还是咖啡,因而也就无法确定放入哪种饮料。
抽象方法的实现要到子类中去, 声明咖啡子类和茶子类实现这两个方法
- public class Coffee extends Beverage {
- @Override
- protected void putIntoCup() {
- System.out.println("把咖啡放到水杯中");
- }
- @Override
- protected void addCondiments() {
- System.out.println("加入糖和牛奶");
- }
- }
- public class Tea extends Beverage {
- @Override
- protected void putIntoCup() {
- System.out.println("把咖啡放到水杯中");
- }
- @Override
- protected void addCondiments() {
- System.out.println("加入糖和牛奶");
- }
- }
现在建立一个测试类Test 来使用一下模版模式
- public class Test {
- public static void main(String[] args) {
- // 咖啡制作
- Beverage coffee = new Coffee();
- coffee.prepareBeverageTemplate(); // 调用模版
- System.out.println("\n***********************\n");
- // 茶制作
- Beverage tea = new Tea();
- tea.prepareBeverageTemplate(); // 调用模版
- } }
其实第4个步骤 加调味料不是必须的, 因为有些人喝茶或咖啡是不加调料的,那么怎么让我们程序更加通用化或者更加体现个性化需求?那就要提供一个钩子函数,具体到每个场景,使用不同的钩子函数。这时我们要把 addCondiments 方法放到一个if 函数进行调用, 而if 条件就是我们的钩子函数的调用。
prepareBeverageTemplate 方法中的代码修改如下
- if (isCustomered()) {
- // 加入调味应有剂
- addCondiments();
- }
新增 isCustomered 方法
- // 钩子函数,是否需要定置
- protected boolean isCustomered() {
- return true;
- }
这时只要在子类中override这个钩子函数,就可以实现个性化需求,比如在茶中,复写这个方法
- public class Tea extends Beverage {
- @Override
- protected void putIntoCup() {
- System.out.println("把咖啡放到水杯中");
- }
- @Override
- protected void addCondiments() {
- System.out.println("加入糖和牛奶");
- }
- @Override
- protected boolean isCustomered() {
- return false;
- }
- }
这时运行Test, 你就可以去掉加调味料这个步骤
Java 设计模式 ------ 模板设计模式的更多相关文章
- Java设计模式——模板设计模式
模板设计模式 1.模板模式简介 模板模式(Template ):模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑 ...
- Java中的模板设计模式,太实用了!
顾名思义,模板设计模式就是将许多公用的常用的代码封装成一个模板,我们只需要实现不同的业务需求的代码,然后和模板组合在一起,那么就得到完整的逻辑. 在我们的日常开发中,常用的模板模式有两种实现方式:继承 ...
- 【设计模式】Java设计模式 - 模板模式
Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- JAVA设计模式:模板设计模式
1.模板设计模式,是为了体现继承的作用.它主要的作用就是在类中定义一些公共的方法和标准,而其具体的实现则叫给其子类来根据子类具体的行为来实现:因为模板设计模式中必经还有一些自己的方法不是抽象的方法,只 ...
- java模板设计模式
1.概述 模板设计模式定义:定义一个操作中的算法骨架,将步骤延迟到子类中. 模板设计模式是一种行为设计模式,一般是准备一个抽象类,将部分逻辑以具体方法或者具体的构造函数实现,然后声明一些抽象方法,这样 ...
- Template Method 模板设计模式
什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...
- Java进阶篇 设计模式之十四 ----- 总结篇
前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用 ...
- Java进阶篇设计模式之一 ----- 单例模式
前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...
- java之模板方法设计模式
抽象类体现的就是一种模板模式的设计.抽象类作为多个子类的通用模板.子类在抽象类的基础上进行扩张和改造,但子类总体上会保留抽象类的行为方式. 解决的问题: 当功能内部一部分实现是确定的,一部分实现是不确 ...
随机推荐
- Pyhon流程控制
1.条件控制 Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else. 注意: 1.每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语 ...
- python 自动获取星期
自动获取星期: >>> from time import time,localtime,strftime>>> x=localtime(time())>> ...
- java单例模式总结
目录 一. 饿汉模式(静态初始化) 二.双重检查锁(dcl) 三. 延迟占位类 四.枚举实现 最后 常见安全的单例实现代码和自己的一点理解. 一. 饿汉模式(静态初始化) class Singleto ...
- golang中的context包
标准库的context包 从设计角度上来讲, golang的context包提供了一种父routine对子routine的管理功能. 我的这种理解虽然和网上各种文章中讲的不太一样, 但我认为基本上还是 ...
- vue及Eelement使用过程中遇到的一些问题
在做项目的过程中,目前主要遇到了以下几个问题: 一.样式问题 1.样式中使用scoped的问题: 主要表现在从一个页面跳到另一个页面时,第二个页面的样式不能正确显示,通过刷新才能恢复页面的预定样式. ...
- Python-sys模块-61
sys 模块:和Python解释器打交道的模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退 ...
- H5 audio标签
37-audio标签 注意点: audio标签的使用和video标签的使用基本一样, video中能够使用的属性在audio标签中大部分都能够使用, 并且功能都一样 只不过有3个属性不能用, heig ...
- Python Revisited Day 01
逻辑操作符 身份操作符 is a = ['AAA', 3, None] b = ['AAA', 3, None] a is b #False b = a a is b #True 身份比较速度快,原因 ...
- p2394 精度题
题意:输出n/23即可 解法一: 利用高精度的long double直接输出,但由于n的长度不确定,我们要加个限制%12Lf #include <cstdio> int main(){ l ...
- PHP安装pecl扩展--通用
虽然现在composer很流行,但是有时候,我们还是要安装pecl的扩展. pecl扩展可以在pecl.php.net中查看,想要什么扩展,可以去搜索,比如xdebug.siege.memcached ...