策略模式:封装行为策略,灵活切换实现多态业务逻辑

文章目录

  • 一、引言
  • 二、应用场景
  • 三、模式定义与实现
  • 四、优缺点分析
  • 总结

一、引言

​ 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,并分别封装起来,让它们之间可以互相替换。这种模式使得算法的变化独立于使用算法的客户端,从而实现多态性的策略选择。

二、应用场景

策略模式适用于以下场景:

  1. 系统需要在多种算法中进行切换,每种算法解决的是同一类问题,但具体实现和表现不同。
  2. 需要在运行时根据具体情况动态地选择合适的算法来执行。

例如,在电商系统中,针对不同的会员等级可能有不同的折扣计算方式,如普通会员打折、VIP会员折上折、尊享会员满减等。策略模式可以帮助灵活地切换并应用这些不同的折扣策略。

三、模式定义与实现

策略模式的核心组成部分包括:

在这里插入图片描述

  1. Strategy(策略接口/抽象类):声明了一系列方法,用于定义所有支持的算法的公共接口。
  2. ConcreteStrategy(具体策略类):实现了Strategy接口,提供了具体的算法实现。
  3. Context(上下文角色):持有一个Strategy对象引用,用以调用其方法来执行相关算法,并在必要时能够更改所使用的策略。

以电商平台的折扣策略为例,来具体实现策略模式:

  1. 定义策略接口(Strategy):创建一个名为DiscountStrategy的接口,其中包含一个计算折扣的方法。

    public interface DiscountStrategy {double calculateDiscount(double originPrice, int memberLevel);
    }
    
  2. 定义具体策略类(ConcreteStrategy):为每种会员等级创建相应的折扣策略实现类,如NormalMemberDiscountVIPMemberDiscountPremiumMemberDiscount

    public class NormalMemberDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originPrice, int memberLevel) {return originPrice * 0.9; // 普通会员9折}
    }public class VIPMemberDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originPrice, int memberLevel) {return originPrice * 0.85; // VIP会员8.5折}
    }public class PremiumMemberDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originPrice, int memberLevel) {if (originPrice > 500) {return originPrice - 200; // 尊享会员满500减200} else {return originPrice * 0.8; // 若不满500元,按8折计算}}
    }
    
  3. 定义上下文角色(Context):创建一个名为Order的类,其中包含一个DiscountStrategy对象的引用,并提供设置和获取折扣策略的方法,以及计算订单实际价格的方法。

    public class Order {private DiscountStrategy discountStrategy;public void setDiscountStrategy(DiscountStrategy strategy) {this.discountStrategy = strategy;}public double calculateFinalPrice(double originPrice, int memberLevel) {return discountStrategy.calculateDiscount(originPrice, memberLevel);}
    }
    
  4. 应用端使用:在应用程序中,可以根据会员等级动态选择并应用相应的折扣策略。

    public class StrategyPatternDemo {public static void main(String[] args) {Order order = new Order();int normalMemberLevel = 1;order.setDiscountStrategy(new NormalMemberDiscount());System.out.println("普通会员应付金额:" + order.calculateFinalPrice(1000, normalMemberLevel));int vipMemberLevel = 2;order.setDiscountStrategy(new VIPMemberDiscount());System.out.println("VIP会员应付金额:" + order.calculateFinalPrice(1000, vipMemberLevel));int premiumMemberLevel = 3;order.setDiscountStrategy(new PremiumMemberDiscount());System.out.println("尊享会员应付金额:" + order.calculateFinalPrice(1000, premiumMemberLevel));}
    }

测试结果

在这里插入图片描述

四、优缺点分析

优点:

  1. 提高了系统的灵活性:策略模式允许在运行时动态地改变和选择算法,增强了程序的可扩展性。
  2. 易于新增策略:只需添加新的具体策略类即可增加新的行为,对已有代码无影响。

潜在挑战:

  1. 可能导致类数量增加:每一种策略都需要创建一个新的类,当策略种类较多时,类的数量会迅速增长。
  2. 客户端必须了解各种策略之间的区别:客户端需要知道如何选择和切换策略,这可能会增加客户端的复杂性。

总结

​ 策略模式通过将一系列可互换的算法封装成单独的类,使得客户端可以在运行时动态地选择或更换算法,从而实现灵活多变的行为策略。在实际应用中,合理运用策略模式有助于简化业务逻辑,降低耦合度,提高代码的可维护性和复用性。同时应注意控制策略类的增长,避免过度设计,确保模式的应用符合实际需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2812960.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java+SpringBoot+Vue+MySQL构建银行客户管理新平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

电感电流波形分析

电感电流波形分析 首先,当电感充电时候(红色回路)电感左右两端是左正右负 假设在初始状态下,电容两端电压是0V,可以看出来A点电位是400V,B和C两端电容也都是0V 根据电感表达式di/dtUL/L400V/L 所以看得出…

【OnlyOffice】 桌面应用编辑器,版本8.0已发布,PDF表单、RTL支持、Moodle集成、本地界面主题

ONLYOFFICE桌面编辑器v8.0是一款功能强大、易于使用的办公软件,适用于个人用户、企业团队和教育机构,帮助他们高效地处理文档工作并实现协作。无论是在Windows、macOS还是Linux平台上,ONLYOFFICE都能提供无缝的编辑和共享体验。 目录 ONLYOFF…

华为高级路由技术 2023-2024

2023-2024 一、2.26路由协议版本优先级和度量主和备路由最长匹配原则递归路由和默认路由 一、2.26 路由协议版本 (1)RIP: IPv4网:RIPv1,RIPv2(v1和v2 不兼容) IPv6网:RIPng(Next g…

【网站项目】475商城系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

羊大师解读,羊奶都拥有哪些特点?

羊大师解读,羊奶都拥有哪些特点? 羊奶除了上述提到的丰富营养成分和健康优势外,还有以下一些特点: 接近母乳:羊奶的分子结构与母乳非常相似,特别是其含有大量的乳清蛋白,这使得羊奶成为婴儿和…

动态规划课堂2-----路径问题

目录 引言: 例题1:不同路径 例题2:不同路径II 例题3:礼物的最⼤价值 例题4:下降路径最⼩和 例题5:最小路径和 结语: 引言: 在学习完动态规划斐波那契数列模型后,…

【正式成立】工业互联网甄选联盟

工业互联网甄选联盟 联盟文件(PDF):下载链接,提取码:m5d7 依托将近20年工业领域的智能制造相关项目实施经验、管理经验和产品开发经验;依托iNeuOS工业互联网操作系统、人工智能物流系统、MES制造执行系统等…

动态规划-最长公共子串(c)

动态规划 动态规划(dynamic programming)是一种算法设计方法。基本思想是在对一个问题的多阶段决策中,按照某一顺序,根据每一步所选决策的不同,会引起状态的转移,最后会在变化的状态中获取到一个决策序列。…

pdf如何压缩文件大小?pdf文件在线压缩方法介绍

在日常工作中,我们经常使用PDF文件进行传输和保存,然而,有时候我们会遇到过大的PDF文件,这不仅会导致传输困难,还会占用过多的设备空间,因此,我们需要对PDF压缩一下以便更轻松地传输和保存&…

2024年【安全员-B证】考试资料及安全员-B证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 安全员-B证考试资料是安全生产模拟考试一点通总题库中生成的一套安全员-B证模拟考试,安全生产模拟考试一点通上安全员-B证作业手机同步练习。2024年【安全员-B证】考试资料及安全员-B证模拟考试 1、【多选…

WebFilter【通过过滤器实现登录判断】

WebFilter【通过过滤器实现登录判断】 /*** 检查用户是否已经完成登录*/ WebFilter(filterName "loginCheckFilter",urlPatterns "/*") Slf4j public class LoginCheckFilter implements Filter{//路径匹配器,支持通配符public static final …

MATLAB环境下基于变分贝叶斯的组织学病理图像颜色盲反卷积方法

图像盲反卷积问题仅根据模糊图像估计清晰图像和模糊核,也是一个欠定问题且求解更加困难。但图像盲反卷积算法更实际,因为许多情况下,模糊核都是未知或部分已知的。求解盲反卷积问题需要为未知量选择适当的先验模型,以得到清晰图像…

SM100-40-080-P0-45-S1-B电机厦门参详

SM100-40-080-P0-45-S1-B交流伺服电机也是无刷电机,分为同步和异步电机,运动控制中一般都用同步电机,它的功率范围大,可以做到很大的功率。大惯量,最高转动速度低,且随着功率增大而快速降低。因而适合做低速…

JSON简介以及如何在Python中使用JSON

什么是JSON? JSON是"JavaScript Object Notation"的简称,是一种数据交换格式 JSON格式 假设我们有一个对象,这个对象有两个属性:“name”跟“age”。 在JSON中是这样表达的: { "name":"男孩…

APP软件设计要注意的问题

设计一个成功的APP软件需要考虑多个方面,成功的APP设计需要综合考虑用户体验、性能稳定性、安全性、兼容性、反馈机制、内容质量和法律合规等多个方面,不断优化和改进以满足用户需求并提升用户满意度。以下是一些需要注意的问题,希望对大家有…

免费的通配符(泛域名证书)?

通配符证书(Wildcard SSL Certificate)是一种SSL证书,它可以用于保护一个域名及其所有的子域名。与传统的SSL证书不同,传统SSL证书仅用于保护一个单独的完全限定域名或一个子域名。通配符证书通过在域名前加上一个星号&#xff08…

VUE从0到1创建项目及基本路由、页面配置

一、创建项目:(前提已经安装好vue和npm) 目录:E:\personal\project_pro\ windows下,win+R 输入cmd进入命令行: cd E:\personal\project_pro E:# 创建名为test的项目 vue create test# 用上下键选择vue2或vue3,回车确认创建本次选择VUE3 创建好项目后,使用…

【可实战】被测系统业务架构、系统架构、技术架构、数据流、业务逻辑分析

一、为什么要学习 更深的理解业务逻辑(公司是做什么的?它最重要的商务决策是什么?它里面的数据流是怎么做的?有哪些业务场景?考验你对这家公司、对所负责业务的熟悉程度。公司背后服务器用什么软件搭建的?…

面试官: 反射了解么?

目录 反射 什么是反射 ? 获取Class对象的四种方式 反射相关API 类对象常用API Filed常用API Method常用API Constructors常用API 反射的使用场景? 反射的实现原理 ?(todo) 反射为什么这么慢 ? 反射的优缺点 反射中,Class.forName和ClassLoader的区别…