当前位置: 首页 > news >正文

趣谈设计模式之策略模式-比特咖啡给你一杯满满的情绪价值,让您在数字世界里”畅饮“

策略模式

在程序运行时动态的选择不同的算法策略或者行为,是一种行为型设计模式。策略对象之间是独立的,没有共享状态,客户端自由选择不同的策略对象。

策略模式的角色
  • 策略接口类
  • 具体策略类
  • 上下文对象: 持有一个或多个策略对象,将具体的任务委托给其中的某个策略对象完成
策略模式的优缺点

优点:

  • 提高代码的可维护性和可扩展性,满足开闭原则
  • 避免条件判断:通过策略模式,可以避免在代码中使用大量的条件判断语句,使代码更加简洁和易于维护
  • 具有一定的安全性,将算法封装起来,对于外部调用者只关注不同的策略的作用,无需关心策略的具体实现

缺点:

  • 复杂度不可控,随着策略类的增多,客户端需要知道所有的策略类,并显式的选择不同的策略对象,会使代码变得复杂。
策略模式的应用场景举例
  • 满减、返现、促销等活动
  • 游戏的情节设置,打斗场景等
# 定义支付策略接口类
class PaymentStrategy(ABC):@abstractmethoddef pay(self, money):pass# 定义具体支付策略类
class AliPayStrategy(PaymentStrategy):def pay(self, money):print(f"使用支付宝支付{money}元。")class WechatPayStrategy(PaymentStrategy):def pay(self, money):print(f"使用微信支付{money}元。")class PaymentContext:def __init__(self, strategy: PaymentStrategy):self.strategy = strategydef set_strategy(self, strategy: PaymentStrategy):self.strategy = strategydef payment(self, money):self.strategy.pay(money)# 支付终端
def payment_client():# 创建支付上下文对象,并初始化支付策略类alipay = AliPayStrategy()wechatpay = WechatPayStrategy()context = PaymentContext(alipay)context.payment(100)context.set_strategy(wechatpay)context.payment(200)
策略模式虚构故事

比特咖啡老板姬比特:幸瑞,我们比特数字咖啡最最最最重要的是盈利,我设计了一种套餐方案,给你2周时间把它实现了。
包月2.9元:月月新鲜
包季6.9元:季度优惠
包年19.9元:年度超值
牛马程序员幸瑞:好的,我准备把包月、包季、包年的价格策略分别做成不同的“策略类”。用户选哪个套餐,我们就用哪个策略来计算费用。这样不仅灵活,还能随时添加新的套餐,完全不影响现有系统!
姬比特:听起来不错!那具体怎么实现呢?
幸瑞:比如说,包月2.9元,包季6.9元,包年19.9元。我们可以把这些策略写成代码,让顾客根据自己的需求选择。而且,通过策略模式,我们还可以动态调整价格,比如搞个“半年特惠”,只需要加一个新的策略类就行了!

且看幸瑞的实现代码:

class PricingStrategy:def calculate_cost(self, months):pass# 月包
class MonthlyStrategy(PricingStrategy):def calculate_cost(self, months):return 2.9 * months# 季包
class QuarterlyStrategy(PricingStrategy):def calculate_cost(self, months):# 每季度3个月quarters = months // 3remainder = months % 3return 6.9 * quarters + 2.9 * remainder# 年包
class AnnualStrategy(PricingStrategy):def calculate_cost(self, months):# 每年12个月years = months // 12remainder = months % 12return 19.9 * years + 2.9 * remainder# 上下文对象
class CoffeePricingContext:def __init__(self, strategy):self.strategy = strategydef set_strategy(self, strategy):self.strategy = strategydef get_total_cost(self, months):return self.strategy.calculate_cost(months)# 客户端-实现动态切换,以月为基本单位,给与用户最大优惠
# 创建具体的策略对象
monthly_strategy = MonthlyStrategy()
quarterly_strategy = QuarterlyStrategy()
annual_strategy = AnnualStrategy()# 创建咖啡定价上下文,并设置初始策略
pricing_context = CoffeePricingContext(monthly_strategy)payment_plan = [quarterly_strategy, annual_strategy]# 各套餐价格
cost = []# 假设用户选择10个月
cost.append(pricing_context.get_total_cost(10))for plan in payment_plan:pricing_context.set_strategy(plan)cost.append(pricing_context.get_total_cost(10))minimum_cost = min(cost)
print(f"您的最优价格: {minimum_cost}")

比特咖啡的故事传送门

http://www.dtcms.com/a/340137.html

相关文章:

  • 数据结构 -- 链表--单向链表的特点、操作函数
  • 【Git 子模块与动态路由映射技术分析文档】
  • 视觉测试:确保应用界面一致性
  • 数据结构 -- 单向链表的特点、操作函数
  • 使用segment-anything将目标检测label转换为语义分割label
  • 数据结构:二叉树oj练习
  • 实现进度条
  • 【大模型早期融合的非标记化架构】
  • 学习strandsagents的http_request tool
  • 【上升跟庄买入】副图/选股指标,动态黄色线由下向上穿越绿色基准线时,发出买入信号
  • Ubuntu 20 各种网卡配置IP的方法
  • 【PyTorch】多对象分割项目
  • 别再手动处理字符串!Python 正则表达式实战手册(入门到精通)
  • 【深度学习新浪潮】Meta 开源最新视觉大模型 DINOv3,该模型有哪些技术亮点?
  • 【数据结构】使用队列解决二叉树问题
  • CentOS安装SNMPWalk
  • C++高频知识点(二十二)
  • 算法题Day3
  • 理解MCP:开发者的新利器
  • 从零开始理解一个复杂的 C++/CUDA 项目 Makefile
  • React学习(六)
  • 梅森公式计算传递函数及结构图转换为信号流图过程
  • STM32-FreeRTOS快速入门指南(中)
  • HJ3 明明的随机数
  • 数据结构——双链表
  • 人工智能细分方向全景图:从入门到专精的技术路径
  • AI出题人给出的Java后端面经(十⑨)(日更)
  • 零成本上线个人网站 | Cloudflare Pages 全流程实战指南
  • A股大盘数据-20250819 分析
  • redis基础----通用命令