模版模式和策略模式的区别
前言
模版模式和策略模式在日常开发中经常遇到,这两个设计模式有啥区别,这里简单总结下。
模版模式简单demo
// 抽象模板类
abstract class AbstractClass {// 模板方法定义了算法的骨架public void templateMethod() {// 执行固定的步骤step1();step2();step3();}// 抽象方法,由子类实现具体的步骤protected abstract void step1();protected abstract void step2();// 钩子方法,由子类选择性地实现具体的步骤protected void step3() {// 默认实现}
}// 具体模板类
class ConcreteClass extends AbstractClass {protected void step1() {System.out.println("执行步骤1");}protected void step2() {System.out.println("执行步骤2");}protected void step3() {System.out.println("执行步骤3");}
}// 客户端代码
public class TemplatePatternExample {public static void main(String[] args) {AbstractClass template = new ConcreteClass();template.templateMethod();}
}
上述例子中,抽象类AbstractClass定义了算法的骨架,通过templateMethod方法控制算法的整体流程,每个具体的步骤由抽象方法和钩子方法定义。具体子类ConcreteClass根据需要实现具体的步骤。客户端通过创建具体子类的实例并调用templateMethod方法来使用模板模式。
策略模式简单demo
// 定义一个接口,表示可互换的算法
interface Strategy {void execute();
}// 实现具体的算法
class ConcreteStrategy1 implements Strategy {public void execute() {System.out.println("执行策略1");}
}// 实现具体的算法
class ConcreteStrategy2 implements Strategy {public void execute() {System.out.println("执行策略2");}
}// 客户端代码
public class StrategyPatternExample {public static void main(String[] args) {// 根据需要选择具体的策略Strategy strategy = new ConcreteStrategy1();// 执行策略strategy.execute();// 切换到另一个策略strategy = new ConcreteStrategy2();// 执行策略strategy.execute();}
}
上述例子中,定义了一个表示可互换的算法的接口Strategy,并实现了两个具体的策略类ConcreteStrategy1和ConcreteStrategy2。客户端根据需要选择并使用不同的策略。通过创建具体策略类的实例并调用execute方法来使用策略模式。
总结
模板模式(Template Pattern)和策略模式(Strategy Pattern)是两种常用的设计模式,它们在解决不同的问题上有一些区别。
- 模板模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板模式通过在父类中定义算法的骨架然后使用抽象方法暴露可变部分,使得子类可以根据自身需求实现具体的步骤。这种方式可以确保算法的结构不变,但允许特定步骤的自定义实现。
- 策略模式也是一种行为设计模式,它定义了一组可以相互替换的算法,并使得这些算法可以独立于使用算法的客户而变化。策略模式将每个算法封装在不同的类中,并允许客户端根据需要选择要使用的算法。这种方式将算法的选择和使用与具体算法的实现分离开来,提供了更高的灵活性和可扩展性。
总结来说,模板模式侧重于使用继承来实现算法的骨架,并允许子类实现具体的步骤,而策略模式侧重于使用组合来选择和使用不同的算法实现。模板模式在父类中定义了算法的骨架,子类只负责实现具体的步骤,而策略模式将算法的选择和使用完全交给了客户端。
相关文章:
模版模式和策略模式的区别
前言 模版模式和策略模式在日常开发中经常遇到,这两个设计模式有啥区别,这里简单总结下。 模版模式简单demo // 抽象模板类 abstract class AbstractClass {// 模板方法定义了算法的骨架public void templateMethod() {// 执行固定的步骤step1();step…...
Github搭建个人博客全攻略
Github搭建个人博客全攻略 一、Github二、配置博客仓库三、配置Git用户SSH密钥四、Deploy Key or Token方法一: Deploy Key方法二: Token 五、Hexo六、 主题七、 发布博文八、参考链接 一、Github Github是开发者的代码仓库,一个开源和分享社…...
gensim conherence model C_V 值与其他指标负相关BUG
在我用gensim3.8.3 conherence model分析京东评论主题模型时, C_V 与npmi、u_mass出现了强烈的皮尔逊负相关: 这些地方也反映了类似问题: https://github.com/dice-group/Palmetto/issues/12 https://github.com/dice-group/Palmetto/issue…...
QT DAY3
1.思维导图 2.完成闹钟的实现 头文件 #include <QTextToSpeech> #include <QTextEdit> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTQLineEdit *edit1new QLineEdit;// QTextEdit *edit2new QTe…...
TortoiseGit(小乌龟)使用问题总结
1.git clone fatal authentication failed for ‘请求路径‘, git clone 用户没有权限 待定 参考: 1.git clone fatal authentication failed for ‘请求路径‘, git clone 用户没有权限_git clone fatal: authentication failed for_椰子…...
106、Redis和Mysql如何保证数据一致
Redis和Mysql如何保证数据一致 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不一致先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中,这种方案能解决1方案的问题,但是在高并发下性能较低,而且仍然会出现数据不一致的问题,比如线程1删除了…...
SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密
1.使用环境 springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 2.引入依赖 !-- 配置文件加密 --> <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><ver…...
k8s核心概念
一、集群架构与组件 1,相关组件 【1】 master node三个组件 k8s的控制节点,对集群进行调度管理,接受集群外用户去集群操作请求master node 组成(四个组件):控制面 API Server:通信kube-Sche…...
opencv 处理的视频 保存为新视频 ,新视频 无法读取
问题描述: 如题 问题原因: 其实就是保存的帧如果处理成灰度图(单通道)的话,保存为新视频,则新视频读取不了 解决办法: 处理成三通道,保存的新视频即可被读取 代码: Vi…...
《golang设计模式》第一部分·创建型模式-02-原型模式(Prototype)
文章目录 1. 概念1.1 简述1.2 角色1.3 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念 1.1 简述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 1.2 角色 Prototype(抽象原型类):它是声明克隆方法的接口…...
SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现
SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现 实战前先做一个背景了解。 单体架构、SOA和微服务 单体架构:近几年技术的飞速发展,各种各样的服务已经进入到网络化。单体架构发布时只需要打成一个war或jar包发布即可&a…...
23.7.27 牛客暑期多校4部分题解
1010 - Kong Ming Qi 1005 - Data Generation 题意、思路待补 code #include <bits/stdc.h> using namespace std; const long long MOD 998244353; int t; long long n, m; long long sub(long long a, long long b) {return a - b < 0 ? a - b MOD : a - b;}…...
Ubuntu 20.04 安装教程
最近貌似很多同学都在下载 ubuntu 虚拟机,但网上很多的安装教程不是很全,所以今天重新更新一下这篇博文(更新日期:2022.12.3),希望能帮到大家。除此之外,安装过程确实比较繁琐,可能会…...
如何评判算法好坏?复杂度深度解析
如何评判算法好坏?复杂度深度解析 1. 算法效率1.1 如何衡量一个算法好坏1.2 算法的复杂度 2 时间复杂度2.1 时间复杂度的概念2.1.1 实例 2.2 大O的渐进表示法2.3 常见时间复杂度计算举例 3 空间复杂度4 常见复杂度对比5 结尾 1. 算法效率 1.1 如何衡量一个算法好坏 …...
【HashMap】2352. 相等行列对
2352. 相等行列对 解题思路 使用哈希容器遍历grid数组 将每一行的字符全部转换为StringBuilde对象 然后存入map中遍历每一列 将其转换为字符串 然后查找Map中是否存在 如果存在 统计 class Solution {public int equalPairs(int[][] grid) {// 哈希容器Map<String,Intege…...
如何声明静态方法 和 实现?
如何声明静态方法 和 实现?在 C 中,声明和实现静态方法(静态成员函数)与普通成员函数有一些区别。静态方法属于类本身,而不是类的对象,因此在声明和实现时需要特殊的语法。 声明静态方法: 在类…...
哈工大计算机网络课程局域网详解之:无线局域网
哈工大计算机网络课程局域网详解之:无线局域网 文章目录 哈工大计算机网络课程局域网详解之:无线局域网IEEE 802.11无线局域网802.11体系结构802.11:信道与AP关联 本节介绍一下平时经常使用的一个无线局域网技术,也就是通常我们使…...
系统集成|第六章(笔记)
目录 第六章、整体管理6.1 项目整体管理概述6.2 主要过程6.2.1 制订项目章程6.2.2 制订项目管理计划6.2.3 指导与管理项目工作6.2.4 监控项目工作6.2.5 实施整体变更控制6.2.6 结束项目或阶段 上篇:第五章、立项管理 第六章、整体管理 6.1 项目整体管理概述 概述&a…...
MySQL主从复制环境部署
文章目录 MySQL主从复制什么是主从复制:为什么需要主从复制:配置文件修改-主:时间同步:重启服务-主:创建同步用户:查看主上的二进制文件名及位置:配置-从:测试:注: MySQL…...
day42-servlet下拉查询/单例模式
0目录 1.Servlet实现下拉查询(两表) 2.单例模式 1.实战 1.1 创建工程,准备环境... 1.2 接口 1.3 重写方法 1.4 servlet 1.5 list.jsp list.jsp详解 2.单例模式 2.1 饿汉模式:在程序加载时直接创建对象&#…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
