(十 四)趣学设计模式 之 策略模式!

目录
- 一、 啥是策略模式?
- 二、 为什么要用策略模式?
- 三、 策略模式的实现方式
- 四、 策略模式的优缺点
- 五、 策略模式的应用场景
- 六、 总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解模板方法模式请看: (十 三)趣学设计模式 之 模版方法模式!
✨更多请看个人主页: 码熔burning
这篇文章带你详细认识一下设计模式中的策略模式
一、 啥是策略模式?
想象一下,你要去旅游 ✈️,可以选择不同的交通方式:飞机 ✈️、火车 🚄、汽车 🚗。 你可以根据自己的需求和预算,选择最合适的交通方式。
策略模式,就是用来解决算法选择的问题! 它可以将算法封装成独立的策略类,并让客户端可以灵活地选择不同的策略 🎁。
简单来说,就是把不同的算法封装起来,让客户端可以根据需要选择不同的算法!
- 你需要使用不同的算法来解决同一个问题: 就像你需要使用不同的排序算法来排序数据 🔢!
- 你希望在运行时动态地选择算法: 就像你需要根据不同的用户选择不同的推荐算法 🛍️!
- 你希望避免大量的 if-else 语句: 就像你需要根据不同的条件执行不同的操作 😫!
二、 为什么要用策略模式?
用策略模式,好处多多 👍:
- 提高代码的灵活性: 可以动态地选择不同的策略,使得代码更加灵活 🤸!
- 提高代码的可维护性: 将算法封装成独立的策略类,使得代码更加清晰易懂 💡!
- 符合开闭原则: 可以在不修改现有代码的情况下,增加新的策略,扩展功能 🆕!
- 避免大量的 if-else 语句: 使得代码更加简洁优雅 💫!
三、 策略模式的实现方式
策略模式主要包含三个核心概念:
- 策略接口(Strategy): 定义了策略的接口,声明了所有策略都需要实现的方法 🤝!
- 具体策略类(ConcreteStrategy): 实现了策略接口,封装了具体的算法 ⚙️!
- 环境类(Context): 持有策略接口的引用,负责在运行时选择并调用具体的策略 🏭!
// 策略接口:支付方式
public interface PaymentStrategy {void pay(int amount); // 支付
}// 具体策略类:支付宝支付
public class AlipayPayment implements PaymentStrategy {private String account; // 支付宝账号public AlipayPayment(String account) {this.account = account;}@Overridepublic void pay(int amount) {System.out.println("使用支付宝账号 " + account + " 支付 " + amount + " 元");}
}// 具体策略类:微信支付
public class WechatPayment implements PaymentStrategy {private String phone; // 微信绑定的手机号public WechatPayment(String phone) {this.phone = phone;}@Overridepublic void pay(int amount) {System.out.println("使用微信绑定的手机号 " + phone + " 支付 " + amount + " 元");}
}// 环境类:支付上下文
public class PaymentContext {private PaymentStrategy paymentStrategy; // 支付策略public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void pay(int amount) {paymentStrategy.pay(amount); // 调用支付策略的支付方法}
}// 客户端
public class Client {public static void main(String[] args) {// 创建支付上下文PaymentContext paymentContext = new PaymentContext(new AlipayPayment("1234567890")); // 默认使用支付宝支付// 支付paymentContext.pay(100); // 使用支付宝支付 100 元// 切换支付方式paymentContext.setPaymentStrategy(new WechatPayment("9876543210")); // 切换到微信支付// 再次支付paymentContext.pay(200); // 使用微信支付 200 元}
}
代码解释
PaymentStrategy接口定义了支付策略的接口,声明了pay方法。AlipayPayment类和WechatPayment类实现了PaymentStrategy接口,封装了支付宝支付和微信支付的算法。PaymentContext类是支付上下文,它持有PaymentStrategy接口的引用,负责在运行时选择并调用具体的支付策略。- 客户端通过
PaymentContext类选择支付方式,并调用pay方法进行支付。
输出结果
使用支付宝账号 1234567890 支付 100 元
使用微信绑定的手机号 9876543210 支付 200 元
四、 策略模式的优缺点
优点:
- 提高代码的灵活性 🤸!
- 提高代码的可维护性 💡!
- 符合开闭原则 🆕!
- 避免大量的 if-else 语句 💫!
缺点:
- 增加了类的数量 😫!
- 客户端需要知道所有的策略 🤯!
五、 策略模式的应用场景
- 排序算法: 可以使用不同的排序算法来排序数据 🔢!
- 推荐算法: 可以根据不同的用户选择不同的推荐算法 🛍️!
- 支付方式: 可以选择不同的支付方式进行支付 💰!
- 压缩算法: 可以使用不同的压缩算法来压缩文件 🗜️!
六、 总结
- 策略模式就像选择困难症的福音,算法随心换,策略任你挑! 🎁
- 核心概念包括策略接口、具体策略类和环境类! 🔑
- 优点是提高代码的灵活性、提高代码的可维护性、符合开闭原则、避免大量的 if-else 语句! 👍
- 缺点是增加了类的数量、客户端需要知道所有的策略! 👎
- 适用于需要使用不同的算法来解决同一个问题,或者需要在运行时动态地选择算法的场景! 🎯
希望这篇文章能让你彻底理解策略模式! 💯 祝你学习愉快! 😄
看完请看:(十 五)趣学设计模式 之 命令模式!
相关文章:
(十 四)趣学设计模式 之 策略模式!
目录 一、 啥是策略模式?二、 为什么要用策略模式?三、 策略模式的实现方式四、 策略模式的优缺点五、 策略模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
React:Router路由
ReactRouter引入 在index.js里编辑,创建路由,绑定路由 import React from react; import ReactDOM from react-dom/client; import ./index.css; import reportWebVitals from ./reportWebVitals; import { createBrowserRouter, RouterProvider } from…...
解决docker认证问题 failed to authorize: failed to fetch oauth token
报错信息[bash1]解决方案 全局代理打开“buildkit”: false ,见[图1] [bash1] >docker build -t ffpg . [] Building 71.8s (3/3) FINISHED docker:desktop-linux> [internal] load bui…...
解决Vscode项目同时运行两个项目终端无法自动叠加的问题
终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...
mybatis映射文件相关的知识点总结
mybatis映射文件相关的知识点总结 mybatis官网地址 英文版:https://mybatis.org/mybatis-3/index.html 中文版:https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…...
verilog 基本语法结构与定义
1、词法约定 verilog中的基本词法约定与C类似。verilog描述包含一个 单词流 ,这里 单词 可以是 注释、分隔符、数字、字符串、标识符、关键字。 verilog大小写相关,其中关键字全部小写。 1.1、 空白符 空白符有空格(\b)制表…...
最节省成本的架构方案:无服务器架构
无服务器架构(Serverless Architecture)是一种颠覆性的云计算执行模型,它允许开发者专注于编写和部署代码,而无需担心底层服务器基础设施的管理。这种架构以其按需付费、自动伸缩和简化部署等优势,在成本优化方面表现出…...
docker利用docker-compose-gpu.yml启动RAGFLOW,文档解析出错【亲测已解决】
0.问题说明 想要让RAGFLOW利用GPU资源跑起来,可以选择docker-compose-gpu.yml启动。(但是官网启动案例是86平台的不是NVIDIA GPU的,docker-compose-gpu.yml又是第三方维护,所以稍有问题) 1.问题 docker利用docker-c…...
字节跳动系统攻防算法岗-Flow安全内推
熟悉Android/iOS/鸿蒙/Windows/Linux中的任意一种及多种安全架构,并有漏洞产出; 熟练掌握硬件及BSP安全技术,包括主流SoC安全特性、可信链、TEE等相关技术原理; 熟悉行业主流的安全标准、安全模型、安全解决方案、安全体系&…...
一些有用的电子书
一、Python 1.1、流畅的Python 链接:https://www.aliyundrive.com/s/S4sr1RNXehW 1.2、Python自动化运维与技术实战 链接:https://www.aliyundrive.com/s/dAQQhbyWp3c 1.3、疯狂Python讲义 链接:https://www.aliyundrive.com/s/NnUqjzGB1az …...
TMS320F28P550SJ9学习笔记1:CCS导入工程以及测试连接单片机仿真器
学习记录如何用 CCS导入工程以及测试连接单片机仿真器 以下为我的CCS 以及驱动库C2000ware 的版本 CCS版本: Code Composer Studio 12.8.1 C2000ware :C2000Ware_5_04_00_00 目录 CCS导入工程: 创建工程: 添加工程: C…...
Android中使用Robolectric测试点击事件(不需要手机)
文章目录 一、前言二、简单示例三、注意事项四、另一种写法五、拓展六、参考文档 一、前言 Robolectric 是一个由 Google 维护的开源 Android 测试框架,它允许你以 Android 运行时环境运行单元测试。 Robolectric 提供了一个模拟 Android 运行时环境,允…...
安卓开发相机功能
相机功能 安卓中的相机调用功能也经历了很多的方案升级,目前可选的官方方案是CameraX、Camera2、Camera(废弃),还有一些第三方免费或者是付费的相机库。对于大多数开发者,建议使用 CameraX。 CameraX CameraX 是 An…...
机器学习:监督学习、无监督学习和强化学习
机器学习(Machine Learning, ML)是人工智能(AI)的一个分支,它使计算机能够从数据中学习,并在没有明确编程的情况下执行任务。机器学习的核心思想是使用算法分析数据,识别模式,并做出…...
基于vue3和flask开发的前后端管理系统(一):项目启动准备
准备工作 我们需要准备以下工具 vue3:构建前端 tailwind css:样式库vite:快速构建vue项目pinia :vue3 的事件管理器 flask:后端代码Mysql:数据库 heidisql:数据库图形化界面 vscode࿱…...
一、MySQL备份恢复
一、MySQL备份恢复 1.1 MySQL日志管理 数据库中数据丢失或被破坏可能原因 误删除数据库 数据库工作时,意外断电或程序意外终止 由于病毒造成的数据库损坏或丢失 文件系统损坏后,系统进行自检操作 升级数据库时,命令语句不严格 设备故…...
DeepSeek崛起:如何在云端快速部署你的专属AI助手
在2025年春节的科技盛宴上,DeepSeek因其在AI领域的卓越表现成为焦点,其开源的推理模型DeepSeek-R1擅长处理多种复杂任务,支持多语言处理,并通过搜索引擎获取实时信息。DeepSeek因其先进的自然语言处理技术、广泛的知识库和高性价比…...
SQLite Alter 命令详解
SQLite Alter 命令详解 SQLite 是一种轻量级的数据库,广泛用于各种嵌入式系统、移动应用和小型项目。SQLite 的ALTER TABLE命令用于修改已存在的表结构,包括添加、删除或修改列,以及重命名表等操作。本文将详细解析SQLite的ALTER TABLE命令&…...
2025 聚合易支付完整版PHP网站源码
源码介绍 2025 聚合易支付完整版PHP网站源码 PHP版本:PHP74 源码上传服务器,解压访问域名即可安装 安装完成后一定要设置伪静态 源码里面nginx.txt 就是伪静态 然后复制粘贴到伪静态里面保存即可 部分截图 源码获取 2025 聚合易支付完整版PHP网站源码…...
Android开发Android调web的方法
Android开发Android调web的方法 一般都是web调Android,很少Android调web方法。 我用的是AgentWeb。它内核也是webview。 直接上代码: mAgentWeb.getJsAccessEntrace().quickCallJs("adLookSuccessAndroid",event.getType());它的意思是&am…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
