流畅的python笔记(六)使用一等函数实现设计模式

本文详细介绍了Python中的两种设计模式——策略模式和命令模式。策略模式通过封装一系列算法,允许在运行时选择合适的策略,例如在电商场景中动态选择折扣策略。而命令模式则关注于解耦调用者和接收者,使得调用操作可以灵活传递。文章通过代码示例展示了如何在实际项目中应用这两种模式,包括如何自动选择最佳策略和查找模块中的所有策略。

目录

一、重构策略模式

经典策略模式

使用作为对象的函数实现策略模式

自动选择最佳策略

找出模块中的全部策略

globals()

使用单独模块专门保存所有策略

二、命令模式

总结


一、重构策略模式

经典策略模式

策略模式的定义是:定义 一系列算法(策略),把它们一一封装起来,并且使它们可以相互替换。策略模式使得算法可以独立于使用它的客户而变换,即不同的客户都可以使用某个算法或其它算法。

        下面是一个电商领域使用策略模式的例子。

 策略模式设计的内容如下:

        上下文:即上图中的order,用于把一些计算委托给可互换的不同算法,根据不同算法计算折扣,即用于选择具体策略。

        策略:实现不同算法组件的共同接口。即上图中名为Promotion的抽象类。

        具体策略:策略的具体子类。fidelityProme、BulkPromo和LargeOrderPromo即这里实现的三个具体策略。

        具体策略由上下文类的客户选择,实例化订单之前,系统以某种方式确定选择哪一种策略,然后用这种选择来初始化Order。具体选择哪一种策略,不在当前设计模式的职责范围内。

from abc import ABC, abstractmethod
from collections import namedtuple

Customer = namedtuple('Customer', 'name fidelity') # 姓名和积分

class LineItem:
    
    def __init__(self, product, quantity, price):
        self.product = product
        self.quantity = quantity
        self.price = price

    def total(self) -> '总价格 = 单价 * 数量':
        return self.price * self.quantity

class Order: # 上下文

    def __init__(self, customer, cart : '购买的所有商品种类', promotion : '用于选择策略, 实参类型就是三个具体策略对象'=None):
        self.customer = customer
        self.cart = list(cart) 
        self.promotion = promotion 

    def total(self):
        if not hasattr(self, '__total'):
            self.__total = sum(item.total() for item in self.cart)
        return self.__total

    def due(self) -> "计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值