设计模式第2篇|策略模式


🚀 作者简介:程序员小豪,全栈工程师,热爱编程,曾就职于蔚来、腾讯,现就职于某互联网大厂,技术栈:Vue、React、Python、Java
🎈 本文收录于小豪的前端系列专栏,后续还会更新前端入门以及前端面试的一些相关文章,手把手带你从零学习前端到面试找工作,并如果有想进入前端领域工作的同学,这个前端专栏会对你有所帮助,欢迎关注起来呀
🌼 本人也会持续的去关注AIGC以及鸿蒙的一些动向并总结到博客中,大家感兴趣的可以关注一下我的人工智能专栏
🌊 云原生的入门学习系列,大家有兴趣的可以看一看

目录

  • 引言
  • 策略模式是什么?
  • 实现
    • 不使用策略模式
    • 使用策略模式
  • 优点
  • 结语

引言

最近啊 有一款新游戏非常火,叫幻兽帕鲁,玩家呢可以在这个游戏里用精灵球捕捉帕鲁,捕捉到帕鲁后可以让帕鲁帮你干活赚钱,帕鲁生病你就可以卖掉这批帕鲁,换下一批帕鲁干活,正所谓晚上玩帕鲁,白天当帕鲁,(加入一个电视频道坏了的视频),由于这个游戏的爆火,所以在网上的各个平台都有人去出售这款游戏,小豪有个朋友呢也去网上某个平台购买这个游戏,在购买时需要涉及支付嘛,这个平台给的渠道有微信支付、支付宝支付、抖音支付、paypal支付以及银行支付等等,小豪作为一个程序员嘛,就会开始思考这种多渠道支付场景会如何设计,其中我认为这里面一定会涉及的设计模式就是策略模式

策略模式是什么?

策略模式(Strategy Pattern)是一种软件设计模式,它允许在运行时根据需要选择算法或行为。策略模式通常涉及定义一系列算法,并将它们封装在单独的类中,使得这些算法可以互相替换。
这样讲可能大家会有点懵,秉承着talk is cheap,show me the code的原则,我直接用代码讲解一下吧。

实现

不使用策略模式

下面这段这段代码就是我不使用策略模式对上述多渠道支付场景的实现,我们可以看到每一个支付渠道就要在pay方法中加一个if else,每一个if条件里去对每一个支付场景进行具体实现,但是这样实现起来整个代码看起来不够清晰整洁,也不遵守设计模式的开闭原则,业务复杂度上去后代码不好维护,不好拓展

const pay = (type) => {if(type === 'wx') {wx.pay()} else if(type === 'ali') {ali.pay()} else if(type === 'douyin') {douyin.pay()} else if(type === 'paypal') {paypal.pay() } else if(type === 'xxx') {xxx.pay}
}

使用策略模式

这是我们使用策略模式对上述多渠道支付场景的实现,首先实现了一个Strategy策略类,这个策略类里会初始化一个strategies策略对象,用于不同策略映射不同行为,addStrategy方法用于添加新策略,pay方法用于执行策略.
下面这里讲每一种支付渠道单独封装成了一个方法,用addStrategy方法添加支付渠道与支付渠道行为方法的映射,下面这里执行微信支付,会去strategies取出微信支付对应的行为并执行.

class Strategy {constructor() {this.strategies = {}}addStrategy(type, func) {this.strategies[type] = func}pay(type,params) {return this.strategies[type](params)}
}const payStrategy = new Strategy()const wxPay = (appid) => {wx.authorize()wx.pay(appid)
}const aliPay = (appid) => {ali.authorize()ali.pay(appid)
}const douyinPay = (appid) => {douyin.authorize()douyin.pay(appid)
}const paypalPay = (appid) => {paypal.authorize()paypal.pay(appid)
}const xxxPay = (appid) => {xxx.authorize()xxx.pay(appid)
}payStrategy.addStrategy('wx', wxPay)
payStrategy.addStrategy('ali', aliPay)
payStrategy.addStrategy('douyin', douyinPay)
payStrategy.addStrategy('paypal', paypalPay)
payStrategy.addStrategy('xxx', xxxPay)payStrategy.pay('wx', 'testAppid')

优点

通过上面两段代码的对比,我们可以总结出策略模式具有以下优点:

  1. 分离算法:策略模式将算法的定义与使用分离开来,使得每个算法可以独立变化,易于维护和扩展
  2. 避免使用条件语句:策略模式可以避免使用大量的条件语句,使代码更加清晰、简洁。
  3. 符合开闭原则:新增加算法时不需要修改已有的代码,只需添加新的策略即可。
  4. 提高代码复用性:策略模式将相同的行为封装在不同的策略中,使得这些行为可以被多个上下文共享和复用。

结语

各位看官老爷们好,小豪已经建立了技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。

📝本人目前是在互联网大厂正式工作,也有过多个大厂的工作经历,加入社群也会有简历修改辅导,模拟面试,手把手项目实战教学,大厂工作内推机会以及大厂面试题解析分享等福利。

📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、AIGC、自媒体变现、前沿科技文章分享、论文精读等等。

📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个技术大佬!也随时欢迎您跟我沟通,一起交流,一起成长。变现、进步、技术、资料、项目、你想要的这里都会有

📝网络的风口只会越来越大,风浪越大,鱼越贵!欢迎您加入社群~一个人可以或许可以走的很快,但一群人将走的更远!

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您扫描下方二维码直接加入到我的交流社群!(微信:adcoderhao)

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

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

相关文章

Vertica单点更改服务器ip

需求 服务器网段调整,将ip:192.168.40.190收回,使用ip:192.168.40.200 默认情况下,节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

解锁Web3:数字未来的大门

随着科技的不断推进,我们正站在数字时代的新门槛上。Web3,作为互联网的下一个演进阶段,正在逐渐揭开数字未来的面纱。本文将深入探讨Web3的本质、对社会的影响以及在数字时代中所扮演的关键角色。 什么是Web3? Web3是互联网发展的…

vs2008配置mysql

1.在官网下载C库:MySQL Connector C 1.0.5 2.在官网下载C库:mysql-connector-c-noinstall-6.0.2-win32 3.vs2008中工程配置 4.拷贝dll到程序运行目录

从源码到成功经营:连锁餐饮管理系统的开发实践

连锁餐饮业更是需要精密的系统来统一管理多个分店的运营,提高效益并确保一致的服务标准。所以,本篇文章小编将为大家讲述如何开发连锁餐饮管理系统,希望对您有一定的启发。 一、系统设计与架构 首先,成功的连锁餐饮管理系统源码需…

高等数学:导数

本文主要参考视频如下: 【建议收藏】同济七版《高等数学》精讲视频 | 期末考试 | 考研零基础 | 高数小白_哔哩哔哩_bilibili 仅供本人学习使用。 之前主要学习了三个概念: 极限; 无穷小; 连续; 先简单捋一捋。 极限是说…

IDEA:git 回滚本地提交-git 选择 Reset Current Branch to

前言 回滚提交到本地但是还没有 Push 上去的提交 选择我们要回滚的节点,然后点击 git 选择 Reset Current Branch to… 再选择 Hard 。当我们点击 Reset 的时候,代码就会回滚到单前选中的这个版本

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换?总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密(推荐) 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的,安全性太低 需求: 将密码加密后存储,提高安全性 二、密码加密…

探析零知识证明高能发展路径:走向更安全、私密且可扩展的 Web3 新时代

原文:https://www.coinbase.com/blog/understanding-the-zero-knowledge-landscape 作者:Jonathan King|Coinbase Ventures 编译:TinTinLand 本文核心观点 2023 年,零知识技术吸引了逾 4 亿美元的投资,主…

正则表达式补充以及sed awk

正则表达式: 下划线算 在单词里面 解释一下过程: 在第二行hello world当中,hello中的h 与后面第一个h相匹配,所以hello中的ello可以和abcde匹配 在world中,w先匹配h匹配不上,则在看0,r&#…

三、ElasticSearch集群搭建实战

本篇ES集群搭建主要是在Linux VM上,未使用Docker方式, ES版本为7.10 ,选择7.10版本原因可以看往期文章介绍。 一、ElasticSearch集群搭建须知 JVM设置 Elasticsearch是基于Java运行的,es7.10可以使用jdk1.8 ~ jdk11之间的版本,更高版本还没…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包,之后,将端 口算出,将结果记录在sever-map表中,相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力?NPDP认证正是你需要的!🔥 NPDP认证,即产品经理国际资格认证,由美国产品开发与管理协会(PDMA)所发起,是全球公认的新产品开发专业认…

Redis(九)集群(cluster)

文章目录 概述作用1. redis集群的槽位slot2. redis集群的分片3. 第1,2点的优势:**最大优势,方便扩缩容和数据分派查找**4. slot槽位映射,一般业界有3种解决方案第一种:哈希取余分区第二种:一致性哈希算法分区第三种&am…

源码安装nginx并提供服务脚本

一、下载nginx ①官网复制下载链接 ②在Linux中下载 [rootopenEuler2 ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、解压并指定路径 [rootopenEuler2 ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/ 三、安装依赖 dnf install -y gcc gcc-c mak…

【Cesium】在着色器中计算片元的高程

问题提出 有时候在 Cesium 上做一些效果时,需要知道片元的高程。而渲染是基于笛卡尔坐标的,没有高程这个概念。怎么在着色器中计算片元的高程呢? 基本思路 通常做法是在着色器里对深度纹理采样,将片元的深度值转换为相机坐标。…

一片带你熟练Git分支管理

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.理解分支2.创建分支…

如何快速记忆小鹤双拼键位图?

记忆方法:韵母表 图形 最常用字 韵母表:双拼的基础 图形:帮助新手快速联想回忆 最常用字:快速打字基础 一、单韵母(紫色方块) 一一对应如下表: 单韵母aoeiu、AOEIV 二、复韵母—箭矢型&am…

几种常见编码器优缺点

目录 光电编码器 磁性编码器 编码器在运动控制类产品中比较常见,旋转编码器都是组成运动控制反馈回路的关键元器件,包括工业自动化设备和过程控制、机器人技术、医疗设备、能源、航空航天等。 作为将机械运动转换为电信号的器件,编码器可为…

ASP.NET Core 使用 SignalR 的简单示例

写在前面 ASP.NET SignalR 是一个开源代码库,简化了Web实时通讯方案,可以实时地通过服务端将信息同步推送到各个客户端,可应用于 需要从服务器进行高频更新的应用:包括游戏、社交网络、投票、拍卖、地图和GPS应用; 仪…