面向对象设计模式:行为型模式之模板方法模式

news2024/11/24 20:57:45

一、模板方法引入:泡茶与冲咖啡

  • 泡茶

    • 烧水
    • 泡茶
    • 倒入杯子
    • 加入柠檬
  • 冲咖啡

    • 烧水
    • 冲咖啡
    • 倒入杯子
    • 加入牛奶和糖

在这里插入图片描述

二、模板方法,TemplateMethod

2.1 Intent 意图

  • Define the skeleton of an algorithm in an operation, deferring some steps to lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. 在操作中定义算法的骨架,延迟一些步骤,让子类在不改变算法结构的情况下重新定义算法的某些步骤。

  • “Hook”: Control subclasses extensions(“钩子”:控制子类扩展)

    • You can define a template method that calls “hook” operations at specific points, thereby permitting extensions only at those points. 可以定义一个在特定点上调用“钩子”操作的模板方法,并只允许在这些点上进行扩展。

2.2 Applicability 适用性

  • To implement the invariant parts of an algorithm once and leave it up to subclasses to implement the behavior that can vary. 一次实现算法的不变部分,并将其留给子类来实现可能发生变化的行为.
  • When common behavior among subclasses should be factored and localized in a common class to avoid code duplication. 当子类之间的公共行为应该在一个公共类中被分解和本地化,以避免代码重复时.
  • Control subclasses extensions.

2.3 类图

在这里插入图片描述

2.4 模板方法类实现要点

  • 模板方法类为抽象类
  • 模板方法 final 修饰
  • 最小化原始操作:抽象方法与公用方法
    • An important goal in designing template methods is to minimize the number of primitive operations that a subclass must override to flesh out the algorithm. 设计模板方法的一个重要目标是最小化子类必须覆盖的原始操作的数量

2.5 应用实例

HttpServlet in JavaEE:service()

2.6 泡茶与冲咖啡

  • 饮品类
public abstract class Beverage {
    final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (wantCondiments()) {
            addCondiments();
        }
    }

    // Hock:冲泡
    abstract void brew();

    // Hock:加入调味品
    abstract void addCondiments();

    private void boilWater() {
        System.out.println("Begin boil water! ...... Done!");
    }

    private void pourInCup() {
        System.out.println("Pour in cup!");
    }

    // Hook:默认需要调味品,子类可重写
    boolean wantCondiments() {
        return true;
    }
}

  • 咖啡
public class CoffeeBeverage extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Brew coffee!");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Add milk and sugar to coffee!");
    }
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TeaBeverage extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Brew tea!");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Add lemon to tea");
    }

    @Override
    boolean wantCondiments() {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Would you like to add lemon to tea? Please Enter yes or no(default no)!");
        String ans = null;
        try {
            ans = bf.readLine();
        } catch (IOException e) {
            System.out.println("Error input!");
        }
        if (ans == null || "no".equalsIgnoreCase(ans)) {
            return false;
        }
        return "yes".equalsIgnoreCase(ans);
    }
}

  • Demo for test
public class TemplateDemo {
    public static void main(String[] args) {
        Beverage coffee = new CoffeeBeverage();
        coffee.prepareBeverage();
        System.out.println("\n");
        Beverage tea = new TeaBeverage();
        tea.prepareBeverage();
    }
}

  • Output
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/392501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】BERT变体—BERT-wwm

1.BERT-wwm 1-1 Whole Word Masking Whole Word Masking (wwm)是谷歌在2019年5月31日发布的一项BERT的升级版本,主要更改了原预训练阶段的训练样本生成策略。 原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时&#xff…

路由传参含对象数据刷新页面数据丢失

目录 一、问题描述 二、 解决办法 一、问题描述 【1】众所周知,在veu项目开发过程中,我们常常会用到通过路由的方式在页面中传递数据。但是用到this.$route.query.ObjectData的页面,刷新后会导致this.$route.query.ObjectData数据丢失。 …

(小甲鱼python)函数笔记合集七 函数(IX)总结 python实现汉诺塔详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解函数的闭包(工厂函…

【LeetCode每日一题】——1323.6 和 9 组成的最大数字

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 贪心算法 二【题目难度】 简单 三【题目编号】 1323.6 和 9 组成的最大数字 四【题目描述】 …

【mediasoup】RtpStreamRecv 对rtp 序号的验证

mediasoup 接收到rtp包D:\XTRANS\soup\mediasoup_offical\worker\src\RTC\RtpStreamRecv.cpp代码竟然跟 https://tools.ietf.org/html/rfc3550#appendix-A.1 stuff. 一样的。RtpStreamRecv的 ReceivePacket(RTC::RtpPacket* packet) 处理收到的rtp包 可能会丢弃 判断丢帧 回卷后…

项目团队沟通管理 5大沟通原则

1、沟通内外有别 沟通需要区分团队内和团队外,在团队对外进行沟通时,团队作为一个整体,对外意见需要一致,一个团队需用一种声音说话。 沟通管理5大原则:沟通内外有别​ 2、重视非正式沟通 非正式的沟通有助于关…

FUNIT

无监督图像到图像转换方法学习将给定类中的图像映射到不同类中的类似图像,使用非结构化(非注册)图像数据集。虽然非常成功,但目前的方法需要在训练时访问源类和目标类中的许多图像。我们认为这极大地限制了它们的使用。从人类从少量示例中提取新对象的本…

用报废耳机自制助听器

平常戴着跑步的外挂耳机被洗衣机洗了,不是进水马上捞起来的那种洗,就是全机包括充电盒都在洗衣机里走了一遍洗衣的流程,在晾晒衣服时才发现衣兜里的这付耳机,再进行啥挽救处理都已为时过晚,好在这付耳机并不贵&#xf…

HBuilderX无线连接真机

说明 安装的是HBuilderX,不是HBuilder,adb.exe所在目录是 x:\HBuilderX\plugins\launcher\tools\adbs\ 里面可能有其他版本,用哪个都,建议使用最新的 配置 首先,将真机使用USB连接到电脑上。 在adb目录中启动命令…

iOS设备管理器有人推荐iTunes,有人推荐iMazing,到底如何选择

一说到iTunes软件,想必苹果用户都不会感觉陌生,它为我们在iPhone、iPad等iOS设备和电脑之间进行文件传输提供了便利,但它并没有那么好用,有时甚至让人抓狂。那我们今天就来分享一款可以取代iTunes的良心好软——iMazing&#xff0…

u盘扫描并修复后文件消失了怎么办?2种方法帮助找回

演示机型:技嘉 H310M HD22.0系统版本:Windows 10 专业版软件版本:云骑士数据恢复软件3.21.0.17案例分享:“我的u盘每次插电脑都会弹出要不要扫描并修复的提示窗口,不懂,然后不小心选择了“扫描并修复”&…

并发编程——CAS

如果有兴趣了解更多相关内容的话,可以来我的个人网站看看:耶瞳空间 一:前言 首先看一个案例:我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量1,如何实现&#x…

前端都在聊什么 - 第 4 期

Hello 小伙伴们早上、中午、下午、晚上、深夜好,我是爱折腾的 jsliang~「前端都在聊什么」是 jsliang 日常写文章/做视频/玩直播过程中,小伙伴们的提问以及我的解疑整理。本文章视频同步:TODO:本期对应 2023.01.28 当天直播间的粉丝互动。主要…

关于Scipy的概念和使用方法及实战

关于scipy的概念和使用方法 什么是Scipy Scipy是一个基于Python的科学计算库,它提供了许多用于数学、科学、工程和技术计算的工具和函数。Scipy的名称是“Scientific Python”的缩写。 Scipy包含了许多子模块,其中一些主要的子模块包括: …

eBPF(内核态)和WebAssembly

1 什么是eBPF 无需修改内核,也不用加载内核模块,程序员就可以在内核中执行执行自定义的字节码。 eBPF,它的全称是“Extended Berkeley Packet Filter”, 网络数据包过滤模块。我们很熟悉的 tcpdump 工具,它就是利用了…

Bellman-ford和SPFA算法

目录 一、前言 二、Bellman-ford算法 1、算法思想 2、算法复杂度 3、判断负圈 4、出差(2022第十三届国赛,lanqiaoOJ题号2194) 三、SPFA算法:改进的Bellman-Ford 1、随机数据下的最短路问题(lanqiaoOJ题号1366&…

xss靶场绕过

目录 第一关 原理 payload 第二关 原理 payload 第三关 原理 payload 第四关 原理 payload 第五关 原理 payload 第六关 原理 payload 第七关 原理 payload 第八关 原理 payload 第九关 原理 payload 第十关 原理 payload 第十一关 原理 payl…

Ubuntu 虚拟机 安装nvidia驱动失败,进不了系统

VMware 安装的 Ubuntu 1804 安装 英伟达显卡失败后,启动出现:在上面那个页面,直接使用组合键:Ctrl Alt F3 便可以进入命令行模式。如果可以成功进入,则说明ubantu系统确实起来了,只是界面相关的模块没有成…

Win32api学习之常见编码格式(一)

ASCII编码 ASCII编码是一种最早出现的字符编码方案,它是由美国标准化协会(ASA)于1963年制定的标准,用于在计算机系统中表示英语文本字符集。ASCII编码仅使用7位二进制数(共128个),用于表示英文…

技术开发|电动充气泵控制方案

电动充气泵是为了保障汽车车胎对汽车的行驶安全所配备的,防止遇上紧急问题时没有解决方案,同时也可以检测轮胎胎压。电动充气泵方案具有多种充气模式设定,小到篮球大到汽车等都能够满足其充气需求,共有四种模式充气,分…