【模版方法设计模式】

文章目录

  • 模板方法设计模式
  • 模板方法的设计原则
  • 模板方法设计模式组成部分
  • 代码实现
    • 抽象类实现
    • 具体实现类
    • 执行

模板方法设计模式

模版方法设计模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。
这种设计模式的主要目的是让某些方法的具体实现推迟到子类中去完成,提供一种代码复用的机制。

模板方法的设计原则

1.单一职责:一个类和方法只做一件事。
2.开闭原则:对修改关闭,对扩展开发。
3.里氏替换原则:子类可扩展新方法,但不可修改父类已有方法(父类已提供了具体实现的方法)。
4.依赖倒置:依赖于抽象,而非具体实现,即面向接口编程(如方法参数,类属性使用接口声明,这样可接收任何子类)。
5.接口隔离:使用多个隔离的接口定义抽象,降低耦合。
6.最少知道/迪米特原则:降低类之间的依赖,聚合,组合等。

模板方法设计模式组成部分

在这里插入图片描述

抽象类(Abstract Class):
包含了模版方法及其所需的基本操作方法。
模版方法定义了算法的骨架,通常是由一些基本操作方法组成的步骤。
基本操作方法可以是抽象的(需要子类实现)或具体的(提供默认实现)。
具体子类(Concrete Class):
实现了抽象类中的基本操作方法。
通过重写基本操作方法,子类可以定制算法的某些步骤。

代码实现

抽象类实现

// 抽象类,定义了制作饮料的算法骨架
abstract class Beverage {// 模版方法,定义了制作饮料的步骤public final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}// 基本操作方法protected abstract void brew();  // 子类实现protected abstract void addCondiments();  // 子类实现private void boilWater() {System.out.println("Boiling water");}private void pourInCup() {System.out.println("Pouring into cup");}
}

具体实现类

// 具体子类,具体实现制作茶的步骤
class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("Steeping the tea");}@Overrideprotected void addCondiments() {System.out.println("Adding lemon");}
}// 具体子类,具体实现制作咖啡的步骤
class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("Dripping coffee through filter");}@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk");}
}

执行

// 客户端代码
public class TemplateMethodPatternDemo {public static void main(String[] args) {Beverage tea = new Tea();tea.prepareRecipe();Beverage coffee = new Coffee();coffee.prepareRecipe();}
}

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

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

相关文章

最最最重要的集群参数配置(上)no.7

我希望通过两期内容把这些重要的配置讲清楚。严格来说这些配置并不单单指Kafka服务器端的配置,其中既有Broker端参数,也有主题(后面我用我们更熟悉的Topic表示)级别的参数、JVM端参数和操作系统级别的参数。 需要你注意的是&…

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接

前言 前段时间遇到一个需求:导出变量到Excel里面,这里给出一些命令,同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中,可以使用以下命令来读写Excel文件: 读取Excel文件: xlsread(filen…

Java EE-Spring AOP 面向切面编程

Spring AOP https://www.cnblogs.com/joy99/p/10941543.html 超级详细版:Chapter 6. 使用Spring进行面向切面编程(AOP) AOP 原理 面向切面 ( Aspect Orient Programming ) 面向切面编程,是面向对象编程(OOP) 的一种补充。 在…

基于Qt的网上购物系统的设计与实现

企鹅:2583550535 代码和论文都有 第1章 绪论... 1 1.1 项目背景... 1 1.2 国内外研究现状... 1 1.3 项目开发意义... 3 1.4 报告主要内容... 3 第2章 关键技术介绍... 4 2.1 后端开发技术... 4 2.1.1 C. 4 2.1.2 Qt框架... 4 2.1.3 MySQL数据库... 5 2.2 …

德勤:中国、印度等对ChatGPT等生成式AI应用,处领先地位

全球四大会计事务所之一的德勤(Deloitte)在官网发布了一份,名为《Generative AI in Asia Pacific: Young employees lead as employers play catch-up》的深度调查报告。 主要查看中国、澳大利亚、印度、日本、新加坡、韩国、中国台湾等亚太…

Prompt Engineering Guide

本文转载自:Prompt Engineering Guide https://www.promptingguide.ai/zh/introduction/basics 文章目录 提示工程简介1、基本概念1)基础提示词2)提示词格式 2、提示词要素3、设计提示的通用技巧从简单开始指令具体性避免不精确做还是不做&am…

操作系统实验:进程和线程同步和互斥(生产者消费者问题,睡觉的理发师问题)

1.生产者消费者问题(信号量) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地…

OrangePi Kunpeng Pro开发板初体验——家庭小型服务器

引言 在开源硬件的浪潮中,开发板作为创新的基石,正吸引着全球开发者的目光。它们不仅为技术爱好者提供了实验的平台,更为专业开发者带来了实现复杂项目的可能性。本文将深入剖析OrangePi Kunpeng Pro开发板,从开箱到实际应用&…

vue3父子组件通信,子组件修改父组件传过来的值

一、第一种,通过props方式传值: 父组件: 父组件调用子组件Child1时通过 :msg2 "msg2"把msg2的数据传给子组件,并且通过自定义事件接收子组件的emit通知,用来修改父组件的msg2数据。 源码: &l…

融资融券操作指南(附最低费率开户渠道)

部分朋友在开通融资融券后,对于融资融券的操作不是很熟练,并且存在很多问题。其实,融资融券核心就是一个“借”,你借券商的资金或者股票,看多时借入资金买入,看空时借入券源卖出。你不可能空口白牙的去借&a…

如何画泳道图?

一、绘制泳道图 1、新建一个绘图, 工具箱搜索“泳道图” 2、修改泳道图标题及风格 3、绘制基本的流程图 4、导出Visio格式 选择文件导出,visio格式

安全工程师考试摸拟试题

安全工程师考试摸拟试题安全工程师是指在工程项目中负责安全管理和安全技术服务的专业人员。他们需要具备扎实的理论知识和丰富的实践经验,能够有效预防和控制各类安全风险… 1 安全工程师考试摸拟试题 安全工程师是指在工程项目中负责安全管理和安全技术服务的专业…

实战14:粒子群算法pso优化机器学习集成学习进行数据预测-完整代码数据

视频演示: 效果演示: 主要代码: import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor from xgboost import XGBRegressor from lightgbm import LGBMRegressor from s…

MySQL|主从复制配置

我使用的是两个云服务器,如果读者使用的是虚拟机和本机,配置会简单很多。 关于云服务器安全组设置、防火墙端口等问题请参考文章: 使用华为云服务器进行项目部署(云服务器、防火墙配置) 条件:master 和 s…

SaaS增长三大策略:从用户获取到留存转化的全链路解析

在SaaS(软件即服务)行业中,增长是企业成功的关键。然而,要实现持续增长并非易事,需要一套从用户获取到留存转化的全链路策略。 首先,用户获取是SaaS增长的第一步。 这要求企业明确目标用户群体&#xff0…

【LeetCode】【9】回文数(1047字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给一个整数x,如果x是一个回文整数,返回true;否…

C# VSTO读取Excel单元格Value、Value2

对单个单元格的值,需要用object 对象去接 object value (object)oneCellRange.Value; object value2 (object)oneCellRange.Value2; 对矩形范围的值,需要用object[,]去接 object[,] matrixValues (object[,])matrixRange.Value; object[,] matrixV…

【NumPy】关于numpy.sort()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

MongoDB数据库清理策略: 自动化过期数据删除实战

1、引言 随着应用程序和业务数据的持续增长,有效地管理数据库存储空间成为维护系统性能的关键。在MongoDB这类NoSQL数据库中,定期清理过期数据变得尤为重要,这不仅能释放宝贵的存储资源,还能优化查询性能,确保数据库运…

Qt 对话框或者QMainWindow等类中调用自定义QWidget继承组件

简单的方法如下所示 1、创建一个ui文件,界面布局放入QVBoxLayout或者QHBoxLayout 使用他来放入自定义组件,类似如下 2、代码如下: ui.setupUi(this); { //自定义组价如下 KwTable *Table new KwTable(this); ui.vertical…