“灵活性之光:掌握策略模式塑造可扩展的代码未来“

文章目录

  • 一、概念
  • 二、策略模式的生活场景
  • 三、适用场景
  • 三、角色构成
  • 四、业务场景示例
  • 总结
    • 优点
    • 缺点


一、概念

  1. 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),属于行为型模式。
  2. 通过面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。

二、策略模式的生活场景

  1. 个人的交税率与他的工资有关。
  2. 支付方式的选择,微信支付,支付宝支付,银联支付。

三、适用场景

  1. 针对同一类型问题,有多种处理方式,每一种都能独立解决问题;
  2. 算法需要自由切换的场景;
  3. 需要屏蔽算法规则的场景。

三、角色构成

上下文角色(Context): 用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化;
抽象策略角色(Strategy): 规定策略或算法的行为
具体策略角色(ConcreteStrategy): 具体的策略或算法实现

四、业务场景示例

优惠活动

  1. 创建促销粗略对象PromotionStrategy
/*** <p>*  促销策略对象* </p>** @author shiqi* @version 1.0.0* @createTime 2023-11-16*/
public interface IPromotionStrategy {/*** 执行促销操作*/void doPromotion();
}
  1. 创建优惠券抵扣策略对象
/*** <p>* 优惠券策略* </p>** @author shiqi* @version 1.0.0* @createTime 2023-11-16*/
public class CouponStrategy implements IPromotionStrategy{@Overridepublic void doPromotion() {System.out.println("使用优惠券抵扣");}
}
  1. 创建返现促销策略对象CashbackStrategy
/*** <p>* 返现策略* </p>** @author shiqi* @version 1.0.0* @createTime 2023-11-16*/
public class CashbackStrategy implements IPromotionStrategy{@Overridepublic void doPromotion() {System.out.println("返现,直接打款到支付宝帐号");}
}
  1. 创建拼团优惠策略对象
/*** <p>* 团购策略* </p>** @author shiqi* @version 1.0.0* @createTime 2023-11-16*/
public class GroupbuyStrategy implements IPromotionStrategy{@Overridepublic void doPromotion() {System.out.println("5人成团,可以优惠");}
}
  1. 无优惠策略对象
/*** <p>* 无优惠* </p>** @author shiqi* @version 1.0.0* @createTime 2023-11-16*/
public class EmptyStrategy implements IPromotionStrategy{@Overridepublic void doPromotion() {System.out.println("无优惠");}
}
  1. 创建促销活动方案
/*** <p>* 促销活动方案* </p>** @author shiqi* @version 1.0.0* @createTime 2023-11-16*/
public class PromotionActivity {private IPromotionStrategy promotionStrategy;@SuppressWarnings("all")public PromotionActivity(IPromotionStrategy promotionStrategy) {this.promotionStrategy = promotionStrategy;}/*** 执行促销策略*/public void executePromotionStrategy() {promotionStrategy.doPromotion();}}
  1. 编写客户端测试类
public class Test {public static void main(String[] args) {PromotionActivity promotionActivity=null;// 获取促销策略String promotionKey= "COUPON";if(StringUtils.equals(promotionKey,"COUPON")){promotionActivity=new PromotionActivity(new CouponStrategy());}else if(StringUtils.equals(promotionKey,"CASHBACK")){promotionActivity=new PromotionActivity(new CashbackStrategy());}//....promotionActivity.executePromotionStrategy();}
}

此客户端弊端在于if else太多了,随着业务的扩展只会越来越臃肿,所以需要改造。

  1. 创建促销策略工厂类
public class PromotionStrategyFactory {public static Map<String,IPromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<>();static {PROMOTION_STRATEGY_MAP.put(PromotionKey.EMPTY,new EmptyStrategy());PROMOTION_STRATEGY_MAP.put(PromotionKey.COUPON,new CouponStrategy());PROMOTION_STRATEGY_MAP.put(PromotionKey.CASHBACK,new CashbackStrategy());PROMOTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY,new GroupbuyStrategy());}public interface PromotionKey{String EMPTY = "EMPTY";String COUPON = "COUPON";String CASHBACK = "CASHBACK";String GROUPBUY = "GROUPBUY";}/*** 获取促销策略的键集合** @return 促销策略的键集合*/public static Set<String> getPromotionStrategyKeys(){return PROMOTION_STRATEGY_MAP.keySet();}/*** 根据促销码获取促销策略* @param promotionKey 促销码* @return 促销策略*/public static IPromotionStrategy getPromotionStrategy(String promotionKey){return PROMOTION_STRATEGY_MAP.get(promotionKey);}}
  1. 改写客户端
public class Test {public static void main(String[] args) {// 获取促销策略String promotionKey= "COUPON";IPromotionStrategy promotionStrategy = PromotionStrategyFactory.getPromotionStrategy(promotionKey);promotionStrategy.doPromotion();}
}

总结

优点

  1. 策略模式符合开闭原则
  2. 避免使用多重条件转移语句,如if…else…语句,switch语句
  3. 使用策略模式可以提高算法的保密性和安全性。

缺点

  1. 客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
  2. 代码中会产生非常多策略类,增加维护难度。

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

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

相关文章

SQL注入学习--GTFHub(布尔盲注+时间盲注+MySQL结构)

目录 布尔盲注 手工注入 笔记 Boolean注入 # 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 时间盲注 手工注入 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 MySQL结构 手工注入 sqlmap注入 笔记 union 联合注入&#xff0c;手工注入的一般步骤 …

代码随想录算法训练营第五十二天|300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

第九章 动态规划part13 300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数…

【Mysql系列】Mysql基础篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

低代码编辑平台后台实现

背景 之前做过一个前端低代码编辑平台&#xff0c;可以实现简单的移动端页面组件拖拽编辑&#xff1a; https://github.com/li-car-fei/react-visual-design 最近基于C的oatpp框架实现了一下后台。使用oatpp框架做web后台开发时&#xff0c;发现按照官方的示例使用的话&#…

Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?

计算机网络技术的不断应用&#xff0c;为企业的生产运营提供了极大便利&#xff0c;网络技术的不断发展也带来了许多网络安全隐患&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到许多企业的求助&#xff0c;企业的计算机服务器遭到了babyk勒索病毒的攻击&#xff0c;导致…

text/xml和application/xml

困惑 在http消息中&#xff0c;同样是传送xml信息&#xff0c;有的时候看到Content-Type的值是text/xml&#xff0c;有的时候值是application/xml&#xff0c;感到困惑。 例如&#xff0c;用Postman发送http消息给Tomcat中的基于JAX-WS的 web服务&#xff1a; 请求中传送了xm…

vue实现浏览器关闭或刷新弹窗提示(beforeunload/unload)

vue实现浏览器关闭或刷新弹窗提示 一、推荐代码二、错误情况说明1.在beforeunload事件里面加alert2.在一个没有焦点的 iframe 或 frame 浏览器会阻止 beforeunload 弹窗3.无法触发destroyed/beforedestroyed/deactivated4.能触发beforeRouteEnter&#xff0c;但不能触发beforeR…

003.Vim编辑器

Vim 是由Vi 发展演变过来的文本编辑器&#xff0c;因其具有语法高亮显示、多视窗编辑、代码折叠、支持插件等功能&#xff0c;现已成为众多Linux发行版本的标配。 1、Vim 工作模式 Vim 具有多种工作模式。常用的工作模式有&#xff1a;普通模式、插入模式、命令模式。 普通模…

vue3基础学习(上)

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

洗地机选购攻略,洗地机哪个品牌好?一篇教会你挑到好用的洗地机

随着国内生活水平的提高&#xff0c;智能清洁产品的呼声也越来越高&#xff0c;尤其是洗地机&#xff0c;可以说是国内各个品牌的洗地机铺天盖地而来&#xff0c;那么如何挑选洗地机成了很多新手的困惑&#xff0c;别着急&#xff0c;笔者今天就给大家讲讲洗地机! 一、购买洗地…

【Axure教程】滑动内容选择器

滑动内容选择器通常是一种用户界面组件&#xff0c;允许用户通过滑动手势在一组内容之间进行选择。这种组件可以在移动应用程序或网页中使用&#xff0c;以提供直观的图片选择体验。 那今天就教大家如何用中继器制作一个滑动内容选择器&#xff0c;我们会以滑动选择电影为案例…

HTML5学习系列之标题和正文、描述性信息

HTML5学习系列之标题和正文、描述性信息 标题和正文标题段落 描述性信息强调注解备选上下标术语代码预定义格式缩写词编辑提示引用引述换行显示修饰非文本注解 总结 标题和正文 标题 按语义轻重排列&#xff1a;h1\h2\h3\h4\h5\h6 <h1>诗词介绍</h1> <h2>…

外汇天眼:什么是非农?非农数据对外汇市场的重要性!

非农数据在外汇市场中扮演着何等关键的角色&#xff1f; 美国非农数据&#xff0c;简称“非农”&#xff0c;具体指排除农业部门、个体户和非盈利机构雇员后的就业相关数据&#xff0c;是反映美国经济实际就业和整体经济状况的关键指标。该数据由美国劳工部劳动统计局每月发布…

ExoPlayer架构详解与源码分析(8)——Loader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

map和set的简易封装(纯代码)

RBTree.h #pragma once#include<iostream> #include<vector> using namespace std;enum colar { red,black };template<class T>//有效参数就一个 struct RBTreeNode {RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr)…

黑马点评回顾 redis实现共享session

文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat&#xff0c;但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#xff0c;并且把自己的信息存放到第一台服务器…

免费的快速手机文件解压APP,快冲

各位小伙伴们大家好&#xff0c;今天我要介绍一款手机上必备的神奇工具&#xff01;你有没有经常遇到需要解压文件情况呢&#xff1f;还在为不知道用哪个软件而烦恼吗&#xff1f;别担心&#xff0c;我给你带来了解决方案 &#xff0c;就是这一款免费的解压精灵。 解压精灵是一…

【Nginx】使用nginx进行反向代理与负载均衡

使用场景 反向代理&#xff1a;一个网站由许多服务器承载的&#xff0c;网站只暴露一个域名&#xff0c;那么这个域名指向一个代理服务器ip&#xff0c;然后由这台代理服务器转发请求到网站负载的多台服务器中的一台处理。这就需要用到Nginx的反向代理实现了 负载均衡&#xf…

怎么去掉邮件内容中的回车符

上图是Outlook 截图&#xff0c;可见1指向的总有回车符&#xff1b; 故障原因&#xff1a; 不小心误按了箭头4这个选项&#xff1b; 解决方法&#xff1a; 点击2箭头确保tab展开&#xff1b; 点击3以找到箭头4. 取消勾选或者多次点击&#xff0c;即可解决。

@JSONField注解

JSONField注解 JSONField注解是阿里巴巴fastjson库中的注解&#xff0c;用于控制Java对象与JSON字符串之间的转换。它可以用于控制序列化和反序列化过程中的一些细节&#xff0c;例如日期格式、序列化顺序、字段名称等。 JSONField注解的常用属性包括&#xff1a; - name&am…