✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——策略模式 (Strategy Pattern)​详解
📚 ** ps **  :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 简介

三. 核心思想

四. 主要角色

五. 简单demo(Java)

六. 策略模式的优点

七. 策略模式的缺点

八. 总结


一. 背景

我原本也不知道策略模式是什么......知道有一天,发现手上需求的底层用的就是策略模式,于是才恍然大悟。于是结合网上的一些资料,完成了这篇博客。


二. 简介

策略模式​​ 是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。

大白话讲,就是定义了几个表示不同类型的类,让它们可以作为参数传入管理类的同一个方法中——至于为什么都满足管理类的方法参数条件,因为这些类型类都实现了一个相同的基类.......


三. 核心思想

  • 定义一组算法​​:把它们封装成独立的类(即策略类),这些类实现相同的接口或继承相同的抽象类。
  • 运行时动态选择算法​​:客户端在使用时根据需要选择具体的策略,而不需要修改使用算法的代码。
  • 遵循开闭原则(OCP)​​:对扩展开放,对修改关闭。新增策略时无需修改已有代码。

四. 主要角色

  1. Context(上下文)​
    持有一个策略对象的引用,负责与客户端交互,并调用策略对象的方法来执行具体行为。
  2. Strategy(策略接口)​
    定义所有支持的算法或行为的公共接口。
  3. ConcreteStrategy(具体策略类)​
    实现 Strategy 接口,提供具体的算法实现。

五. 简单demo(Java)

下面代码模拟了一个电商系统,针对不同用户类型(如普通用户、VIP用户)有实现不同的折扣策略。

// Strategy: 折扣策略接口
public interface DiscountStrategy {double applyDiscount(double originalPrice);
}
// ConcreteStrategy: 普通用户无折扣
public class NoDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice;}
}// ConcreteStrategy: VIP用户打8折
public class VipDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice * 0.8;}
}
// Context: 负责使用策略
public class PricingContext {private DiscountStrategy discountStrategy;// 设置策略public void setDiscountStrategy(DiscountStrategy strategy) {this.discountStrategy = strategy;}// 执行折扣计算public double calculatePrice(double originalPrice) {if (discountStrategy == null) {throw new IllegalStateException("未设置折扣策略");}return discountStrategy.applyDiscount(originalPrice);}
}
public class Client {public static void main(String[] args) {PricingContext context = new PricingContext();double price = 100.0;// 普通用户,无折扣context.setDiscountStrategy(new NoDiscountStrategy());System.out.println("普通用户价格: " + context.calculatePrice(price)); // 输出 100.0// VIP用户,打8折context.setDiscountStrategy(new VipDiscountStrategy());System.out.println("VIP用户价格: " + context.calculatePrice(price)); // 输出 80.0}
}

通过上面的这些代码,通过简单的改变参数,就实现了对价格计算的快速替换,减少了if/else的判断逻辑,让代码更加简洁,并且容易扩展。


六. 策略模式的优点

  • ​开闭原则​​:新增策略不影响现有代码。
  • 消除条件语句​​:避免大量的 if-else 或 switch-case。
  • 提高可维护性与可扩展性​​:策略实现独立,易于理解和替换。
  • 算法复用​​:策略可以在不同的上下文中复用。

七. 策略模式的缺点

  • 客户端必须了解不同策略​​:客户端需要知道有哪些策略并选择合适的策略。
  • 类数量增多​​:每一种策略都是一个类,可能会增加类的数量。
  • 策略对象之间的通信较复杂时处理不便​​:如果策略之间有依赖关系,可能需要额外设计。

八. 总结

策略模式是一种行为型模式。通过定义一系列封装并可互换算法,以达到避免大量条件判断,实现算法的灵活切换和扩展的目的。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

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

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

相关文章

CI(持续集成)、CD(持续交付/部署)、CT(持续测试)、CICD、CICT

目录 **CI、CD、CT 详解与关系** **1. CI(Continuous Integration,持续集成)** **2. CD(Continuous Delivery/Deployment,持续交付/部署)** **持续交付(Continuous Delivery)** **持续部署(Continuous Deployment)** **3. CT(Continuous Testing,持续测试)** **4.…

【音视频】WebRTC ICE 模块深度剖析

原文链接: https://mp.weixin.qq.com/s?__bizMzIzMjY3MjYyOA&mid2247498075&idx2&sn6021a2f60b1e7c71ce4d7af6df0b9b89&chksme893e540dfe46c56323322e780d41aec1f851925cfce8b76b3f4d5cfddaa9c7cbb03a7ae4c25&scene178&cur_album_id314699…

linux0.12 head.s代码解析

重新设置IDT和GDT,为256个中断门设置默认的中断处理函数检查A20地址线是否启用设置数学协处理器将main函数相关的参数压栈设置分页机制,将页表映射到0~16MB的物理内存上返回main函数执行 源码详细注释如下: /** linux/boot/head.s** (C) 1991 Linus T…

Maven动态控制版本号秘籍:高效发包部署,版本管理不再头疼!

作者:唐叔在学习 专栏:唐叔的Java实践 关键词:Maven版本控制、versions插件、动态版本号、持续集成、自动化部署、Java项目管理 摘要:本文介绍如何使用Maven Versions插件动态控制项目版本号和依赖组件版本号,实现无需…

简述:普瑞时空数据建库软件(国土变更建库)之一(变更预检查部分规则)

简述:普瑞时空数据建库软件(国土变更建库)之一(变更预检查部分规则) 主要包括三种类型:常规检查、行政区范围检查、20X异常灭失检查 本blog地址:https://blog.csdn.net/hsg77

shell中命令小工具:cut、sort、uniq,tr的使用方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、cut —— 按列或字符截取1. 常用选项2. 示例二、sort —— 排序(默认按行首字符升序)1. 常用选项常用 sort 命令选项三、uniq —— 去…

【Linux】Linux开发必备:Git版本控制与GDB调试全指南

前言:在Linux开发流程中,版本控制与程序调试是保障项目稳定性和开发效率的两大核心环节。Git作为当前最主流的分布式版本控制系统,能高效管理代码迭代、追踪修改记录并支持多人协同开发;GDB(GNU调试器)是Li…

实现 TypeScript 内置工具类型(源码解析与实现)

目标读者:已经熟悉 TypeScript 基础语法、泛型、条件类型的同学。本文按常见工具类型的分类与顺序实现并解释 Partial、Required、Readonly、Pick、Omit、Record、Exclude、Extract、NonNullable、ReturnType、Parameters、ConstructorParameters、InstanceType、Th…

Spring Boot + Nacos 配置中心示例工程

1️⃣ 工程结构 nacos-demo├── pom.xml└── src├── main│ ├── java│ │ └── com.example.nacosdemo│ │ ├── NacosDemoApplication.java│ │ ├── config│ │ │ └── AppProperties.java│ │ └── cont…

(二)文件管理-基础命令-pwd命令的使用

文章目录1. 命令格式2. 基本用法3. 高级用法4. 注意事项1. 命令格式 pwd [OPTION]...[OPTION]: 可选选项,用于改变命令的默认行为。最主要的两个选项是 -L 和 -P。它不需要任何参数(如文件名或目录名) 2. 基本用法 用法:pwd 是…

Leetcode_202.快乐数_三种方法解决(普通方法解决,哈希表解决,循环链表的性质解决_快慢指针)

目录第一种方法:暴力解法暴力ac代码:第二种方法:哈希表哈希表ac代码:第三种方法:根据循环链表的性质(快慢指针)第一种方法:暴力解法 最暴力的思路就是直接使用循环往下一直计算,这样特别浪费时间&#xff…

代码随想录刷题Day48

这次博客主要是对做过的关于二叉树系列的题目进行整理和分类。二叉树,要处理整个树,一般少不了遍历。遍历主要可以分为:递归系列、层序遍历。如果不遍历的话,那就是处理特殊的树了,比如完全二叉树。递归系列基本的递归…

汽车工装结构件3D扫描尺寸测量公差比对-中科米堆CASAIM

汽车制造过程中,工装结构件的尺寸精度对整车装配质量和生产进度有重要影响。传统测量工具如卡尺和三坐标测量机采用接触式工作方式,检测过程耗时较长,对于具有复杂曲面特征的工件,难以全面获取尺寸数据。激光三维扫描技术改变了传…

Docker Pull 代理配置方法

本文介绍通过网络代理加速Docker镜像拉取的方法。 配置方法 当执行docker pull从Docker Hub 拉取镜像时,其网络连接由守护进程docker daemon进行维护。 要修改其代理设置,可配置其systemd服务,步骤如下: (1&#xf…

机电装置:从基础原理到前沿应用的全方位解析

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 机电装置的基本概念与发展历程 机电装置(Mechatronic D…

《SVA断言系统学习之路》【03】关于布尔表达式

序列中使用的表达式基于其所含变量的采样值进行评估。表达式评估的结果为布尔值,其解释方式与过程性if语句条件中的表达式完全相同:若表达式计算结果为X、Z 或 0,则被解释为假;否则即为真。但是,对可出现在并发断言中的…

指针高级(2)

6.数组指针#include <stdio.h> int main() {/*练习&#xff1a;利用指针遍历数组*///1.定义数组int arr[] { 10,20,30,40,50 };int len sizeof(arr) / sizeof(int);//2.获取数组的指针//实际上获取的&#xff1a;数组的首地址int* p1 arr;int* p2 &arr[0];printf…

如何高效记单词之:抓住首字母——以find、fund、fond、font为例

find、fund、fond、font这几个单词&#xff0c;你都认识吗&#xff1f;这几个单词&#xff0c;意思大体如下&#xff1a; find v.找到&#xff1b;发现fund n.基金fond a.喜欢的&#xff1b;喜爱的&#xff1b;深情的font n.字体&#xff0c;字型&#xff0c;字形 这几个单词在…

Ubuntu下把 SD 卡格式化为 FAT32

在 Ubuntu 下把 SD 卡格式化为 FAT32&#xff0c;按下面做&#xff08;会抹掉整卡数据⚠️&#xff09;&#xff1a; 1) 找到你的 SD 卡设备名 lsblk -p记下整盘设备&#xff0c;比如 /dev/sdb&#xff08;USB 读卡器常见&#xff09;或 /dev/mmcblk0&#xff08;内置读卡器&am…

涉私数据安全与可控匿名化利用机制研究(上)

文章目录前言一、涉私数据的概述及分类&#xff08;一&#xff09;涉私数据的“知情同意原则”&#xff08;二&#xff09;涉私数据的分类二、涉私数据可控匿名化利用机制&#xff08;一&#xff09;数据产品与涉私数据的利用形式&#xff08;二&#xff09;通过可信数据空间受…