当前位置: 首页 > 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…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...