【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.mzph.cn/news/718186.shtml

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

相关文章

UE 打包窗口及鼠标状态设置

UE 打包窗口及鼠标状态设置 打包后鼠标不锁定 显示鼠标图标 打包后设置窗口模式 找到打包路径下的配置文件GameUserSettings,设置相关项目 FullscreenMode0表示全屏模式,1表示窗口全屏模式,2表示窗口模式

模型部署 - BevFusion - (1) - 思路总结

模型部署实践 - BevFusion 思路总结一、网络结构 - 总结1.1、代码1.2、网络流程图1.3、模块大致梳理 二、Onnx 的导出 -总体思路分析三、优化思路总结 学习 BevFusion 的部署,看了很多的资料,这篇博客进行总结和记录自己的实践 思路总结 对于一个模型我…

【代码】Android|获取压力传感器、屏幕压感数据(大气压、原生和Processing)

首先需要分清自己需要的是大气压还是触摸压力,如果是大气压那么就是TYPE_PRESSURE,可以参考https://source.android.google.cn/docs/core/interaction/sensors/sensor-types?hlzh-cn。如果是触摸压力就是另一回事,我需要的是触摸压力。 不过…

软考 系统分析师系列知识点之系统分析的任务、难点与要求(1)

所属章节: 第10章. 系统分析 第1节. 系统分析概述 系统分析阶段也称为逻辑设计阶段,其任务是根据系统设计书所确定的范围,对现有系统进行详细设计调查,描述现有系统的业务流程,指出现有系统的局限性和不足之处&#x…

事故预测 | Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测

事故预测 | Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测 目录 事故预测 | Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测预测效果基本描述程序设计参考资料 预测效果 基本描述 Matlab基于FuzzySVR模糊支持向量机多特征变量事故预测 运行环境: Matlab2023及以 上…

C语言数组作为函数参数

有两种情形; 一种是数组元素作为函数实参;一种是数组名作为函数参数; 新建一个VC6单文档工程; void printshz(int , CDC* , int , int ); double getav(int a[5]); ...... void CShzcshView::OnDraw(CDC* pDC) {CShzcshDoc* pDo…

Pthon图像处理Opencv初步:色彩转换、打开摄像头

文章目录 处理流程颜色空间二值图像摄像头 python图像处理教程:初步📷插值变换📷形态学处理📷滤波 处理流程 opencv是跨平台图像处理库,为许多编程语言提供了接口,Python自然在列,但在使用pip…

32单片机基础:PWM驱动舵机,直流电机

PWM驱动舵机 接线图如上图所示。注意,舵机的5V 线不能接到面包板上的正极,面包板上的正极只有3.3V,是STM32提供的,所以要接到STLINK的5V, 我们如何驱动舵机呢?由之前我们介绍原理知道,要输出如下图对应的PWM波形才行…

AWTK 开源串口屏开发(11) - 天气预报

# AWTK 开源串口屏开发 - 天气预报 天气预报是一个很常用的功能,在很多设备上都有这个功能。实现天气预报的功能,不能说很难但是也绝不简单,首先需要从网上获取数据,再解析数据,最后更新到界面上。 在 AWTK 串口屏中…

数字革命的浪潮:Web3如何改变一切

随着数字技术的不断发展,人类社会正迎来一场前所未有的数字革命浪潮。在这个浪潮中,Web3技术以其去中心化、安全、透明的特性,正在逐渐改变着我们的生活方式、商业模式以及社会结构。本文将深入探讨Web3技术如何改变一切,以及其所…

volatile关键字的作用 以及 单例模式(饿汉模式与懒汉模式的区别及改进)

文章目录 💡volatile保证内存可见性💡单例模式💡饿汉模式💡懒汉模式💡懒汉模式多线程版💡volatile防止指令重排序 💡volatile保证内存可见性 Volatile 修饰的变量能够保证“内存可见性”以及防…

解决连接工具Mobaxterm连接错误Connection timed out----VMware里Linux端口号固定

错误:Connection timed out 原因: 没有固定ip,网络断开,再次连接就是新的IP 解决: 再次测试连接,弹出这个就代表成功了

CUDA 中的线程组织

明朝那些事中有一句话:我之所以写徐霞客是想告诉你,所谓千秋霸业万古流芳,与一件事相比,其实都算不了什么,这件事情就是——用你喜欢的方式度过一生。 我们以最简单的 CUDA 程序:从 GPU 中输出 Hello World…

实现一个简单的哈希映射功能

说在前面 🎈哈希表大家应该都经常用到吧,那么大家有没有想过哈希表是怎么实现的呢?今天让我们一起从一道简单的题目来初步了解一个哈希表的简单原理。 目的 不使用任何内建的哈希表库设计一个哈希映射(HashMap)。 实…

bert 相似度任务训练完整版

任务 之前写了一个相似度任务的版本:bert 相似度任务训练简单版本,faiss 寻找相似 topk-CSDN博客 相似度用的是 0,1,相当于分类任务,现在我们相似度有评分,不再是 0,1 了,分数为 0-5,数字越大…

EasyRecovery易恢复2024免费文件数据恢复软件下载

一、软件概述 EasyRecovery易恢复中文文件数据恢复软件是一款专为中文用户设计的强大数据恢复工具。该软件致力于帮助用户从各种存储设备中恢复因各种原因丢失的中文文件,如文档、图片、视频、音频等。凭借其核心技术和多年的研发经验,EasyRecovery易恢…

STM32-SPI通信协议

串行外设接口SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线。 在某些芯片上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。 SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换…

【数据结构与算法】常见排序算法(Sorting Algorithm)

文章目录 相关概念1. 冒泡排序(Bubble Sort)2. 直接插入排序(Insertion Sort)3. 希尔排序(Shell Sort)4. 直接选择排序(Selection Sort)5. 堆排序(Heap Sort)…

【脑科学相关合集】有关脑影像数据相关介绍的笔记及有关脑网络的笔记合集

【脑科学相关合集】有关脑影像数据相关介绍的笔记及有关脑网络的笔记合集 前言脑模板方面相关笔记清单 基于脑网络的方法方面数据基本方面 前言 这里,我将展开有关我自己关于脑影像数据相关介绍的笔记及有关脑网络的笔记合集。其中,脑网络的相关论文主要…

TOMCAT的安装与基本信息

一、TOMCAT简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为&#xff0c…