python策略模式
from abc import ABC,abstractmethod from collections import namedtuple ##############商品类############## class Item: def __init__(self,name,price,num): self.name = name self.price = price self.num = num def total(self): return self.price * self.num ############订单类############### class Order: def __init__(self,customer,promotion=None): self.cart = [] self.customer = customer self.promotion = promotion def add_to_cart(self,*items): for item in items: self.cart.append(item) def total(self): total = 0 for item in self.cart: total += item.total() return total def due(self): if not self.promotion: discount = 0 else: discount = self.promotion.discount(self) return (self.total()-discount) #################折扣策略类################### class Promotion(ABC): @abstractmethod def discount(self,order): pass class FidelityPromo(Promotion): """ 如果积分满100分,就可以兑换10元现金券 """ def discount(self,order): return 10 if order.customer.fidelity > 1000 else 0 class BulkItemPromo(Promotion): """ 如果单件商品购买10件,即可9折 """ def discount(self,order): discount = 0 for item in order.cart: if item.num >=10: discount += item.total() * 0.1 return discount class LargeOrderPromo(Promotion): """ 如果订单总金额大于等于500,就减50 """ def discount(self,order): discount = 0 if order.total()>=500: discount = 50 return discount ###############最优策略类############# class BestPromo(Promotion): def discount(self, order): # 找出当前文件中所有的策略 all_promotion = [globals()[name] for name in globals() if name.endswith('Promo') and name != 'BestPromo'] # 计算最大折扣 return max([promo().discount(order) for promo in all_promotion]) #############消费者############ Customer = namedtuple('Customer','name fidelity') if __name__ == '__main__': xm = Customer('xiaoming',1500) item1 = Item('鞋',200,3) item2 = Item('衣服',400,1) order = Order(xm,FidelityPromo()) order.add_to_cart(item1,item2) # print(order.total()) # print(order.due()) xh = Customer('xiaohong',300) item3 = Item('盐',10,10) item4 = Item('油',50,10) item5 = Item('米',70,2) order = Order(xh,BestPromo()) order.add_to_cart(item3,item4,item5) print(order.total()) print(order.due())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人