【Python设计模式04】策略模式

devtools/2024/9/22 10:57:24/

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化不会影响使用算法的客户端,使得算法可以独立于客户端的变化而变化。

策略模式的结构

策略模式主要包含以下角色:

  1. 策略接口(Strategy):定义算法的接口。
  2. 具体策略类(Concrete Strategy):实现策略接口的具体算法。
  3. 上下文类(Context):使用策略对象的上下文,维护对策略对象的引用,并在需要时调用策略对象的方法。

示例

假设我们要设计一个计算不同类型折扣的系统。我们可以使用策略模式来实现这一功能。

定义策略接口
python">from abc import ABC, abstractmethodclass DiscountStrategy(ABC):@abstractmethoddef apply_discount(self, price: float) -> float:pass
实现具体策略类
python">class NoDiscount(DiscountStrategy):def apply_discount(self, price: float) -> float:return priceclass PercentageDiscount(DiscountStrategy):def __init__(self, percentage: float):self.percentage = percentagedef apply_discount(self, price: float) -> float:return price * (1 - self.percentage / 100)class FixedAmountDiscount(DiscountStrategy):def __init__(self, amount: float):self.amount = amountdef apply_discount(self, price: float) -> float:return max(0, price - self.amount)
定义上下文类
python">class PriceCalculator:def __init__(self, strategy: DiscountStrategy):self.strategy = strategydef calculate_price(self, price: float) -> float:return self.strategy.apply_discount(price)
使用策略模式
python">def main():original_price = 100.0no_discount = NoDiscount()ten_percent_discount = PercentageDiscount(10)five_dollar_discount = FixedAmountDiscount(5)calculator = PriceCalculator(no_discount)print(f"Original price: ${original_price}, No discount: ${calculator.calculate_price(original_price)}")calculator.strategy = ten_percent_discountprint(f"Original price: ${original_price}, 10% discount: ${calculator.calculate_price(original_price)}")calculator.strategy = five_dollar_discountprint(f"Original price: ${original_price}, $5 discount: ${calculator.calculate_price(original_price)}")if __name__ == "__main__":main()

策略模式的优缺点

优点
  1. 开闭原则:可以在不修改上下文类的情况下引入新的策略,实现算法的独立变化。
  2. 消除条件语句:通过使用策略模式,可以避免在上下文类中使用大量的条件语句。
  3. 提高代码复用性:不同的策略类可以复用相同的算法接口,提高代码的复用性和可维护性。
缺点
  1. 增加类的数量:每个策略都是一个单独的类,可能会增加类的数量,导致代码复杂度增加。
  2. 策略切换的开销:在运行时切换策略可能会带来一些性能开销。

策略模式的适用场景

  1. 算法需要在运行时选择:当一个系统需要在运行时从多个算法中选择一个时,可以使用策略模式
  2. 避免条件语句:当一个类中包含大量与算法选择相关的条件语句时,可以使用策略模式消除这些条件语句。
  3. 需要重用算法:当多个类需要复用相同的算法时,可以将这些算法提取到独立的策略类中,通过策略模式进行重用。

总结

策略模式是一种行为型设计模式,通过定义一系列算法并将每个算法封装起来,使它们可以互相替换,从而实现算法的独立变化和复用。策略模式可以提高代码的灵活性和可维护性,适用于算法需要在运行时选择或消除条件语句的场景。合理使用策略模式,可以显著提高代码的质量和设计水平。


http://www.ppmy.cn/devtools/42558.html

相关文章

Java数据结构与算法(最小栈)

前言 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…

每日新闻掌握【2024年5月20日 星期一】

2024年5月20日 星期一 农历四月十三 小满 TOP大新闻 住建部谈公积金贷款利率下调:100万贷款30年,总利息将减少4.85万元 日前,住房公积金个人住房贷款利率下调0.25个百分点。住房城乡建设部住房公积金监管司相关负责同志接受采访表示&#xf…

2024年电工杯赛题浅析一图流【一张图看懂 2024 年电工杯】

一图流【一张图看懂 2024 年电工杯】 Aspect A 题:园区微电网风光储协 调优化配置 B 题:大学生平衡膳食食谱 的优化设计及评价 数据处理 需要处理园区的负荷曲线、 风光发电数据、储能配置数 据;涉及数据量较大,需进 行数据…

一个超级简单的Python UI库:NiceGUI

大家好,图形用户界面(GUI)的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言,提供了许多优秀的库来帮助开发者实现这一目标。今天,我们将介绍一个名为NiceGUI的库,它能帮助你轻松构建…

2024电工杯数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B<A&#xff0c;开放度&#xff1a;A<B。 以下为AB题选题建议及初步分析&#xff1a; A题&#xff1a;园区微电网风光储协调优化配置 题目描述&#xff1a; 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;需要…

centos7 redis开机启动

[rootlocalhost system]# vim /etc/systemd/system/redis.service 版本是5.0 /usr/local/redis 是redis安装目录 [Unit] DescriptionRedis.server # 指定服务所依赖的其他单元&#xff08;如网络服务&#xff09;。这确保在启动该服务之前&#xff0c;所需的其他单元已经启动…

Vue3子组件调用父组件的方法

父组件 <TableBoxref"tableBoxRef":tableDatas"tableData":page"page"delRow"delRow":table_columns"table_columns"> </TableBox> <script> import TableBox from ./components/tableBox.vue exp…

集合-1 数组ArrayListLinkedList

一.数组 1.什么是数组&#xff1f; 数组是一种用连续的内存空间存储相同类型数据的线性数据结构。 2.为什么数组下标是从0开始&#xff1f; &#xff08;1&#xff09;数组根据下标查找元素是基于寻址公式&#xff1a;元素地址数组首地址索引i*数组存储数据类型的大小 &am…