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

news2024/11/15 15:56:42

🚀 作者简介:程序员小豪,全栈工程师,热爱编程,曾就职于蔚来、腾讯,现就职于某互联网大厂,技术栈: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.coloradmin.cn/o/1421100.html

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

相关文章

Web3技术革新:重新定义在线体验

互联网的不断演进塑造了我们的数字生活,而Web3技术的涌现正带来一场前所未有的变革。本文将深入探讨Web3技术的创新,以及它如何重新定义和提升我们的在线体验。 Web3技术的基本概念 Web3是互联网的第三个时代,它将去中心化、区块链、智能合约…

Mac苹果电脑玩幻兽帕鲁 Crossover玩Windows游戏

​​ 《幻兽帕鲁》(英文:Palworld)是一款近期在 Steam 爆红的动作冒险生存游戏,游戏设置在一个居住着「帕鲁」的开放世界中,玩家可以战斗并捕捉帕鲁,也能用它们来建造基地、骑乘和战斗。 不过目前《幻兽帕…

MATLAB绘制电磁场

MATLAB绘制电磁场举例: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g; m12 for k1:m for j1:m if k1 V(j,k)1; elseif((j1)|(jm)|(km)) V(j,k)0; else …

强敌环伺:金融业信息安全威胁分析——整体态势

从早期的Zeus和其他以银行为目标的特洛伊木马程序,到现在的大规模分布式拒绝服务(DDoS)攻击,再到新颖的钓鱼攻击和勒索软件,金融服务业已成为遭遇网络犯罪威胁最严重的行业之一。金融服务业的重要性不言而喻&#xff0…

暴雨受邀出席太原市人工智能行业协会年度大会

2024年1月26日,太原市人工智能行业协会第二届二次会员大会暨2024年年会成功召开。太原市委、市工商联、市大数据应用中心、市政协经济委员会以及太原市科技局的专家领导,与三百多名来自各行业的人工智能企业家和协会会员一同参加了本次盛会,共…

ARCGIS PRO SDK 数据库属性域设置与获取

一、数据库创建属性域。 sdk3.1 以下的开发版本不支持,不能使用 Pro SDK 向域添加新的编码值,可以使用地理处理工具: 创建属性域 Dim va As IReadOnlyList(Of String) Dim gpResult As ArcGIS.Desktop.Core.Geoprocessing.IGPResult Dim env…

gitee建库并git

箴言:书山有路勤为径 文章目录 前言一、gitee导入ssh二、gitee建库三、克隆到本地四、关联本地工程到远程仓库五、push流程总结 前言 nodejs每天的学习都有代码产出,转念一想不如在码云上面搞个仓库,也经历了些许波折,往常也建了…

论文阅读-MapReduce

论文名称:MapReduce: Simplified Data Processing on Large Clusters 翻译的效果不是很好,有空再看一遍,参照一下别人翻译的。 MapReduce:Simplified Data Processing on Large Clusters 中文翻译版(转) - 阿洒 - 博客园 (cnblogs.com) 概…

Powershell Install telegraf 实现Grafana Windows 图形展示

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

Dragons

题目链接&#xff1a; Problem - 230A - Codeforces 解题思路&#xff1a; 用结构体排序就好&#xff0c;从最小的开始比较&#xff0c;大于就加上奖励&#xff0c;小于输出NO 下面是c代码&#xff1a; #include<iostream> #include<algorithm> using namespac…

React16源码: React中LegacyContext的源码实现

LegacyContext 老的 contextAPI 也就是我们使用 childContextTypes 这种声明方式来从父节点为它的子树提供 context 内容的这么一种方式遗留的contextAPI 在 react 17 被彻底移除了&#xff0c;就无法使用了那么为什么要彻底移除这个contextAPI的使用方式呢&#xff1f;因为它…

什么是Vue Vue入门案例

一、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网&#xff1a;Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进&#xff0c;不一定非得把V…

leetcode hot100分发饼干

在本题中&#xff0c;我们需要采用贪心算法。考虑局部最优解&#xff0c;然后再考虑全局最优解。 比如&#xff0c;在本题中&#xff0c;我们先把胃口和饼干排序&#xff0c;排序之后我们可以采用用大饼干来喂大胃口的孩子&#xff0c;如果此时能满足&#xff0c;那么计数加一…

Linux实验记录:使用LVM(逻辑卷管理器)

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 硬盘分好区或者部署为RAID磁盘阵列…

[嵌入式软件][入门篇][仿真平台] STM32CubeMX的搭建

文章目录 一、简介二、STM32CubeMX的使用(1) 新建文件&#xff0c;芯片选型(2) sys设置和RCC设置(3) 配置时钟(4) 生成代码 三、仿真平台的使用 一、简介 STM32CubeMX是一种图形工具&#xff0c;通过分步过程可以非常轻松地配置STM32微控制器和微处理器&#xff0c;生成相应的初…

13.前端--CSS-盒子模型

1.盒子模型的组成 CSS 盒子模型本质上是一个盒子&#xff0c;封装周围的 HTML 元素&#xff0c;它包括&#xff1a;边框、外边距、内边距、和 实际内容 2.边框&#xff08;border&#xff09; 2.1 边框的使用 1、border设置元素的边框。边框有三部分组成:边框宽度(粗细) 边框…

英特尔正式发布OpenVINO™ 2023.3版本

2024年1月24日&#xff0c;英特尔正式发布了OpenVINO™ 2023.3版本&#xff08;Release Notes for Intel Distribution of OpenVINO Toolkit 2023.3&#xff09;。OpenVINO™是英特尔针对自家硬件平台开发的一套深度学习工具库&#xff0c;包含推断库&#xff0c;模型优化等等一…

软件个性化选型:制造企业如何选择适合自身的工单管理系统-亿发

企业制造业是实体经济中非常重要和基础的组成部分&#xff0c;直接关系到国家经济的血脉。然而&#xff0c;传统制造业在生产与管理上所采用的老一套方法和经验已不再适应当下的发展需求。信息化、数字化和智能化被视为制造企业的必然趋势。要想在竞争激烈的市场中永立潮头&…

基于数字签名技术的挑战/响应式认证方式

挑战/响应式认证方式简便灵活&#xff0c;实现起来也比较容易。当网络需要验证用户身份时&#xff0c;客户端向服务器提出登录请求&#xff1b;当服务器接收到客户端的验证请求时&#xff0c;服务器端向客户端发送一个随机数&#xff0c;这就是这种认证方式的“冲击&#xff08…

代码随想录刷题笔记-Day15

1. 完全二叉树的的节点个数 222. 完全二叉树的节点个数https://leetcode.cn/problems/count-complete-tree-nodes/ 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没…