Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:Python策略模式实现,真实项目背景

设计模式:Python策略模式实现,真实项目背景

作者头像
嘉美伯爵
发布于 2021-01-18 03:09:42
发布于 2021-01-18 03:09:42
1.3K0
举报

今天给大家讲解一下设计模式中的策略模式,下面的图片是真实项目中的前端图片,目前接入了三个算法能力,根据产品经理要求,后期还会有不同的算法加入进来,这个时候我们需要考虑一个好的结构对代码进行优化,可能有一些小伙伴会说直接使用if...elif..else分支语句不就可以了,但是从系统的健壮性和可维护性方面我们在这里不能大量的使用if分支结构,因为每一种算法能力的代码量极其大而且算法参数有的多达十几个,加之后期会有其他算法加入,很容易顾此失彼,牵一发而动全身。接下来我们来讲解一下策略模式的使用。

理论

我们以高德地图来讲解,当我们搜索一个位置的时候,高德地图会给我们展示出不同的出行方式,我们这里只是对模型进行了简单的抽象,当然高德地图肯定用到了其他较为复杂的代码模式。就本页面而言,你会选择使用混乱的if多分支语句吗,显然是不合理的,当我们每选择一个路线的时候,后台就会if分支判断一遍,最差的情况是从头判断到尾。

  • if分支最终代码结构 从商业的角度来说,使用if多分支语句是完全可以正常运行的: 但当后续不断有路线规划算法加入的时候,代码量就会增加一倍,久而久之,你会觉得己没法继续维护这堆代码了。 无论是修复简单缺陷还是微调算法参数, 对某个算法进行任何修改都会影响整个类, 从而增加在已有正常运行代码中引入错误的风险。 此外, 团队合作将变得低效。 如果你在应用成功发布后招募了团队成员, 他们会抱怨在合并冲突的工作上花费了太多时间。 在实现新功能的过程中, 你的团队需要修改同一个巨大的类, 这样他们所编写的代码相互之间就可能会出现冲突。

解决方案

在讲解了多分支语句可能带来的风险和弊端后,我们引入策略模式。看下图,我们将不同的算法封装到独立的类中,也就是抽象出来一个接口,新加入的算法类必须实现这个接口的策略方法。

  • 上下文类 我们来讲解一下上下文类的作用:__init__方法接受具体的算法类,execute_algorithm方法最终被客户端调用,这样上下文其实不知道具体的算法策略。它会通过同样的通用接口与所有策略进行交互, 而该接口只需暴露一个方法来触发所选策略中封装的算法即可。指向具体策略的引用, 且仅通过策略接口与该对象进行交流。
  • 算法基类接口 封装一个所有算法都必须实现的抽象方法,以备上下文进行正确的调用。所有具体策略的通用接口, 它声明了一个上下文用于执行策略的方法。
  • 不同的算法 每个算法的逻辑在各自的类内修改就可以了,代码维护和修改复杂度大大降低。实现了上下文所用算法的各种不同变体。
  • 客户端代码 客户端只需要将即将执行的算法类传入上下文中即可,然后上下文便会动态的执行具体的算法对象。

优缺点

优点

  • 代码解耦,便于维护
  • 可以运行时动态切换算法
  • 开闭原则。无须对上下文代码进行修改,就可以添加新的代码

缺点

  • 如果算法逻辑,较为固定,不经常修改,使用策略模式只会增加代码量

总结

下面我们来总结一下,使用策略模式的步骤

  • 将频繁修改的算法进行抽取,独立为具体的算法类
  • 创建抽象基类,实现一个约定的抽象策略方法
  • 所有独立的算法类,必须实现基类中的抽象策略接口
  • 建立上下类,该类可以动态的对算法进行setter,创建调用具体算法的方法,上下文仅可通过该方法与具体的策略交互
  • 客户端进行调用,传入具体的算法类,上下文动态执行具体的算法任务
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
『设计模式』再谈Macdonald的汉堡口味--策略模式
类的划分原则 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
风骨散人Chiam
2020/10/28
5280
设计模式 ☞ 行为型之策略模式
  策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。   在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。
Demo_Null
2021/01/18
4100
2023 跟我一起学设计模式:策略模式
策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
用户1418987
2023/10/16
2280
2023 跟我一起学设计模式:策略模式
23种设计模式之——策略模式
它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
良月柒
2019/03/19
3800
Java设计模式之策略模式
策略模式是一种行为设计模式,它定义了一组算法,并将每个算法封装成独立的类,使得它们可以相互替换。策略模式使得算法可以独立于客户端而变化,从而提高了代码的灵活性和可维护性。在Java中,策略模式通常涉及一个策略接口或抽象类,多个具体策略类以及一个上下文类。
刺槐儿
2024/02/01
6530
如何管理和维护算法族?只需知道策略模式
同样是排序算法,你可以选择冒泡排序、选择排序、插入排序、快速排序等等,也即是说,为了实现排序这一个目的,有很多种算法可以选择。这些不同的排序算法构成了一个算法族,你可以在需要的时候,根据需求或者条件限制(内存、复杂度等)适时选择具体的算法。
用户6557940
2022/07/24
3720
如何管理和维护算法族?只需知道策略模式
『设计模式』就因为多收了我2块5,我追着收银员问是不是不懂设计模式--策略模式
今天去超市买东西,买了50多块钱的东西,然后收钱的时候他多收了,明明会员要打白金会员打9折,黄金会员95折,我是白金会员因该是9折。 我问她:“你是不是不知道什么是策略模式” 她一脸茫然地看着我,“啊?先生请您再说一遍。” 我说:“我是白金会员,请选择白金会员的策略” 她说:“不好意思,您一年没来我们这里买过东西了,已经给您降档了!” 我说:“还有这操作?。。。。” 朋友觉得我为了几块钱这么墨迹,付完钱拉着我就走了,问我:“你说的什么模式怎么回事?” 我说超市收银系统就是很好的策略系统,就是一个典型策略模式。 多收了2块5,心疼死我了,我慢慢给你讲!
风骨散人Chiam
2020/10/28
2770
C++设计模式——Strategy策略模式
策略模式是一种行为型设计模式,策略模式在软件开发场景中定义了一系列的算法,并将每个算法单独封装在可替换的对象中,使应用程序在运行时可以根据具体的上下文来动态地选择和切换算法,同时保持原有的代码架构不被修改。
Coder-ZZ
2024/07/01
1120
C++设计模式——Strategy策略模式
Java设计模式——策略模式[通俗易懂]
策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化
全栈程序员站长
2022/09/30
4700
Java设计模式——策略模式[通俗易懂]
Java二十三种设计模式-策略模式(13/23)
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
正在走向自律
2024/12/18
2620
Java二十三种设计模式-策略模式(13/23)
设计模式 | 行为型 | 策略模式
策略模式定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。使算法的变化独立于使用它们的客户端。
被水淹没
2023/02/25
3460
设计模式 | 行为型 | 策略模式
【设计模式】策略模式在数据接收和发送场景的应用
我们可以使用工厂模式来改进我们的设计。工厂模式可以帮助我们将对象的创建和使用过程分离,使得上下文类和客户端代码不需要了解具体策略的细节,那么我们来修改一下我们的实现:
绿毛龟
2024/01/19
1710
【设计模式】策略模式在数据接收和发送场景的应用
策略模式(Strategy)
策略模式是一种行为型模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。
兜兜转转
2023/03/29
4810
策略模式(Strategy)
【地铁上的设计模式】--行为型模式:策略模式
策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。这种模式通过定义一系列算法,并将每个算法封装到一个独立的类中,使得它们可以相互替换。通过这种方式,客户端可以根据需要选择要使用的算法,而不必与特定算法相关的实现细节耦合在一起。 策略模式适用于需要根据特定条件在多种算法之间进行切换的场景。它可以使代码更具可读性和可维护性,同时还能提高代码的灵活性和可扩展性。它还可以将算法的实现细节与客户端代码分离开来,从而使得算法可以更容易地进行修改和维护。 然而,使用策略模式可能会导致类的数量增加,从而增加代码的复杂性。此外,使用策略模式时,客户端必须了解不同策略之间的区别,以便能够选择正确的策略。因此,策略模式适用于复杂的场景,而不适用于简单的问题。
喵叔
2023/05/13
2480
设计模式---策略模式
实现某一个功能有多条途径,每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。
大忽悠爱学习
2021/11/15
6190
【设计模式】之策略模式
策略模式属于行为模式,可以在运行时不修改类本身而通过变更内部算法来处理类的行为变更。这允许对象的可扩展性和松耦合性。 经典定义如下:
青山师
2023/05/05
1890
【设计模式】之策略模式
简单工厂模式和策略模式的区别与结合
    简单工厂模式和策略模式是大部分程序员,在学习设计模式时接触得最早,或在工作实践中也是用得相对比较多的两个设计模式。
陈珙
2018/09/12
6.1K0
简单工厂模式和策略模式的区别与结合
设计模式~策略模式
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
Vincent-yuan
2020/08/28
4420
设计模式——策略模式
设计模式——策略模式
Java架构师必看
2021/05/14
3090
设计模式——策略模式
设计模式- 策略模式(Strategy Pattern)
定义 策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致。客户只关心目标而不在意具体的实现方法,实现方法要根据具体的环境因素而变化。 C#例子 // 上传附件策略 public abstract class Strategy { // 上传附件 public abstract void UpLoad(); } // 使用阿里云的策略 public class AliYun
易兒善
2019/05/14
4260
推荐阅读
相关推荐
『设计模式』再谈Macdonald的汉堡口味--策略模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档