当前位置: 首页 > news >正文

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

在这里插入图片描述

目录

    • 一、 啥是策略模式?
    • 二、 为什么要用策略模式?
    • 三、 策略模式的实现方式
    • 四、 策略模式的优缺点
    • 五、 策略模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解模板方法模式请看: (十 三)趣学设计模式 之 模版方法模式!
✨更多请看个人主页: 码熔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&#xff1…...

一、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…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

synchronized 学习

学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...