【Python笔记-设计模式】策略模式

一、说明

策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互相替换。

(一) 解决问题

在需要根据不同情况选择不同算法或策略,规避不断开发新需求后,代码变得非常臃肿难以维护管理。

(二) 使用场景

  • 当一个类有多个行为,而且这些行为在不同的情况下有不同的实现时
  • 当需要在运行时动态地选择算法时
  • 当一个类的一部分行为是固定的,一部分是可变的时,可以使用策略模式来封装可变的部分

二、结构

  1. 上下文(Context)维护指向具体策略的引用,且仅通过策略接口与该对象进行交流。
  2. 策略(Strategy)接口是所有具体策略的通用接口,它声明了一个上下文用于执行策略的方法。
  3. 具体策略(ConcreteStrategies)实现了上下文所用算法的各种不同变体。
  4. 当上下文需要运行算法时,它会在其已连接的策略对象上调用执行方法。上下文不清楚其所涉及的策略类型与算法的执行方式。
  5. 客户端(Client)会创建一个特定策略对象并将其传递给上下文。上下文则会提供一个设置器以便客户端在运行时替换相关联的策略。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
策略模式例:商场优惠活动,选择不同的优惠策略,最后计算的价格也不同。而如果增加新算法,只需增加一个策略类,无需修改现有代码
"""from abc import ABC, abstractmethodclass DiscountStrategy(ABC):"""抽象策略类"""@abstractmethoddef apply_discount(self, price):passclass PercentDiscount(DiscountStrategy):"""具体策略类:打折策略"""def __init__(self, discount_percent):self.discount_percent = discount_percentdef apply_discount(self, price):return price * (1 - self.discount_percent / 100)class FullReduction(DiscountStrategy):"""具体策略类:满减策略"""def __init__(self, full_price, reduction_price):self.full_price = full_priceself.reduction_price = reduction_pricedef apply_discount(self, price):return price - (price // self.full_price) * self.reduction_priceclass Promotion:"""上下文类:商场促销"""def __init__(self, discount_strategy):self.discount_strategy = discount_strategydef apply_discount(self, price):return self.discount_strategy.apply_discount(price)if __name__ == "__main__":"""打折后价格:80.0满减后价格:100"""# 商品原价original_price = 100# 选择打折策略,打8折promotion = Promotion(PercentDiscount(20))discounted_price = promotion.apply_discount(original_price)print(f"打折后价格:{discounted_price}")# 选择满减策略,满200减50promotion = Promotion(FullReduction(200, 50))discounted_price = promotion.apply_discount(original_price)print(f"满减后价格:{discounted_price}")

四、优缺点

优点

  • 灵活性和可扩展性:策略模式将算法封装成独立的类,使得可以独立地添加、修改或替换算法,而不影响到客户端的代码,从而提高了代码的灵活性和可扩展性。
  • 易于维护:由于算法被封装在独立的类中,使得每个算法都有自己的类,易于理解和维护。
  • 避免条件语句的使用:策略模式避免了使用大量的条件语句来选择不同的算法,使得代码更加清晰和易于理解。
  • 符合开闭原则:策略模式符合开闭原则,即对扩展开放,对修改关闭,可以通过添加新的策略类来扩展功能,而不需要修改现有的代码。

缺点

  • 增加了类的数量:每个具体策略都需要一个对应的策略类,可能会增加类的数量。
  • 客户端必须知道所有的策略类:客户端必须知道所有的策略类,并且在使用时需要显式地选择合适的策略类,这可能会增加客户端的复杂性。
  • 如果算法极少发生改变,那么没有任何理由引入新的类和接口。使用该模式只会让程序过于复杂。

【Python笔记】设计模式-CSDN博客

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

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

相关文章

【会议征稿通知】第十届人文学科与社会科学研究国际学术会议(ICHSSR 2024)

第十届人文学科与社会科学研究国际学术会议(ICHSSR 2024) 2024 10th International Conference on Humanities and Social Science Research 第十届人文学科与社会科学研究国际学术会议(ICHSSR 2023)将于2024年4月26-28日在中国厦门隆重举行。会议主要…

基于springboot+html实现的衣物捐赠平台

一、系统架构 前端:html | layui | jquery | css 后端:springboot | thymeleaf | mybatis 环境:jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 注册 03. web页-首页 04. web页-捐赠衣服 05. web页-论坛交流…

铝型材【欧标】

2020: 3030: 4040: 欧标T型螺丝 2020: 10最大 20120 59 3030: 12最大 30150 76 4040: 40最大 40200 …

Java 小项目开发日记 04(文章接口的开发、oss图片上传)

Java 小项目开发日记 04&#xff08;文章接口的开发、oss图片上传&#xff09; 项目目录 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

【开源】JAVA+Vue.js实现天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

SpringBoot启动扩展应用:干预优化+加快启动时间(干货典藏版)

一、SpringBoot启动过程干预 Spring Boot启动过程中我们可以实现以下干预工作&#xff1a; 修改Spring Boot默认的配置属性。使用ConfigurationProperties和EnableConfigurationProperties注解&#xff0c;可以获取和修改Spring Boot的配置属性。 加载配置文件。Spring Boot会…

Beans模块之工厂模块Aware

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

Charles抓包 - 安装、激活、证书配置

最近刚好又遇到了抓包的需求&#xff0c;之前一直使用 Fiddler 抓包&#xff0c;这几年一直听大家都在用 Charles 抓包&#xff0c;正好一起了解下&#xff08;一般建议掌握一种抓包方式即可&#xff0c;都可以解决同种需求场景&#xff09; 抓包 Fiddler抓包 Charles 下载、安…

基于Ruby的watir-webdriver自动化测试方案与实施

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

SpringBoot 手写 Starter

spring-boot-starter 模块 1.介绍 SpringBoot中的starter是一种非常重要的机制&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启动相应的默认配…

配置之道:深入研究Netty中的Option选项

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 配置之道&#xff1a;深入研究Netty中的Option选项 前言Option的基础概念ChannelOption与Bootstrap Option常见的ChannelOption类型ChannelConfig的使用Option的生命周期不同传输协议的Option 前言 在…