当前位置:首页>python>《精通Python设计模式》精读:策略模式

《精通Python设计模式》精读:策略模式

  • 2026-01-23 05:54:14
《精通Python设计模式》精读:策略模式

开篇引子

在软件开发中,我们经常面临这样一个问题:系统需要在多种算法中选择一种来执行特定任务。例如,一个电商平台可能需要支持多种支付方式(如支付宝、微信支付、银行卡等),或者一个报表系统可能需要支持多种排序算法。如果我们使用条件语句来处理这种情况,代码会变得复杂且难以维护。策略模式正是为了解决这类问题而设计的,它将算法封装起来,并使它们可以相互替换。

什么是策略模式?

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。这种模式属于行为型设计模式,它将算法的实现与算法的使用者分离,使我们可以独立地改变它们。

策略模式的主要角色包括: 

策略接口(Strategy):定义所有支持算法的公共接口 

具体策略(Concrete Strategy):实现策略接口的具体算法 

上下文(Context):维护一个对策略对象的引用,可以动态地改变其所使用的策略

实战案例:支付系统

from abc import ABC, abstractmethodclass PaymentStrategy(ABC):    """    支付策略抽象类    """    @abstractmethod    def pay(self, amount):        """        支付方法        :param amount: 支付金额        :return: 支付结果        """        passclass CreditCardPayment(PaymentStrategy):    """    信用卡支付策略    """    def __init__(self, card_number, cvv, expiry_date):        """        初始化信用卡支付        :param card_number: 卡号        :param cvv: 安全码        :param expiry_date: 有效期        """        self.card_number = card_number        self.cvv = cvv        self.expiry_date = expiry_date    def pay(self, amount):        """        执行信用卡支付        :param amount: 支付金额        :return: 支付结果        """        print(f"使用信用卡支付 ¥{amount:.2f}")        print(f"卡号: ****-****-****-{self.card_number[-4:]}")        return {"status""success""method""Credit Card""amount": amount}class AlipayPayment(PaymentStrategy):    """    支付宝支付策略    """    def __init__(self, account):        """        初始化支付宝支付        :param account: 支付宝账号        """        self.account = account    def pay(self, amount):        """        执行支付宝支付        :param amount: 支付金额        :return: 支付结果        """        print(f"使用支付宝支付 ¥{amount:.2f}")        print(f"账户: {self.account}")        return {"status""success""method""Alipay""amount": amount}class WeChatPayment(PaymentStrategy):    """    微信支付策略    """    def __init__(self, phone_number):        """        初始化微信支付        :param phone_number: 手机号        """        self.phone_number = phone_number        self.balance = 1000.0  # 模拟余额    def pay(self, amount):        """        执行微信支付        :param amount: 支付金额        :return: 支付结果        """        if self.balance >= amount:            self.balance -= amount            print(f"使用微信支付 ¥{amount:.2f}")            print(f"手机号: {self.phone_number}")            print(f"余额: ¥{self.balance:.2f}")            return {"status""success""method""WeChat Pay""amount": amount}        else:            print("余额不足!")            return {"status""failed""method""WeChat Pay""amount": amount, "message""余额不足"}class ShoppingCart:    """    购物车上下文类    """    def __init__(self):        self.items = []        self.total = 0.0        self.payment_strategy = None    def add_item(self, item, price):        """        添加商品到购物车        :param item: 商品名称        :param price: 商品价格        """        self.items.append({"item": item, "price": price})        self.total += price        print(f"添加商品: {item}, 价格: ¥{price:.2f}, 总价: ¥{self.total:.2f}")    def set_payment_strategy(self, payment_strategy: PaymentStrategy):        """        设置支付策略        :param payment_strategy: 支付策略        """        self.payment_strategy = payment_strategy        print(f"支付方式已设置为: {payment_strategy.__class__.__name__}")    def checkout(self):        """        结账        """        if not self.payment_strategy:            print("请先选择支付方式!")            return None        print(f"开始结账,总金额: ¥{self.total:.2f}")        result = self.payment_strategy.pay(self.total)        print(f"支付结果: {result['status']}")        return result# 使用策略模式的支付系统print("=== 支付系统策略模式示例 ===")cart = ShoppingCart()# 添加商品cart.add_item("书籍"49.90)cart.add_item("笔记本电脑"5999.00)cart.add_item("鼠标"59.00)# 使用信用卡支付credit_card_payment = CreditCardPayment("1234567890123456""123""12/25")cart.set_payment_strategy(credit_card_payment)cart.checkout()print("\n" + "="*50)# 更换支付方式为微信支付wechat_payment = WeChatPayment("13800138000")cart.set_payment_strategy(wechat_payment)cart.checkout()

=== 支付系统策略模式示例 ===添加商品: 书籍, 价格: ¥49.90, 总价: ¥49.90添加商品: 笔记本电脑, 价格: ¥5999.00, 总价: ¥6048.90添加商品: 鼠标, 价格: ¥59.00, 总价: ¥6107.90支付方式已设置为: CreditCardPayment开始结账,总金额: ¥6107.90使用信用卡支付 ¥6107.90卡号: ****-****-****-3456支付结果: success==================================================支付方式已设置为: WeChatPayment开始结账,总金额: ¥6107.90余额不足!支付结果: failed{'status': 'failed', 'method': 'WeChat Pay', 'amount': 6107.9, 'message': '余额不足'}

策略模式在排序算法中的应用

class SortStrategy(ABC):    """    排序策略抽象类    """    @abstractmethod    def sort(self, data):        """        排序方法        :param data: 待排序的数据        :return: 排序后的数据        """        passclass BubbleSort(SortStrategy):    """    冒泡排序策略    """    def sort(self, data):        """        冒泡排序实现        :param data: 待排序的数据        :return: 排序后的数据        """        print("使用冒泡排序...")        arr = data.copy()        n = len(arr)        for i in range(n):            for j in range(0, n - i - 1):                if arr[j] > arr[j + 1]:                    arr[j], arr[j + 1] = arr[j + 1], arr[j]        return arrclass QuickSort(SortStrategy):    """    快速排序策略    """    def sort(self, data):        """        快速排序实现        :param data: 待排序的数据        :return: 排序后的数据        """        print("使用快速排序...")        arr = data.copy()        self._quick_sort(arr, 0len(arr) - 1)        return arr    def _quick_sort(self, arr, low, high):        """        快速排序辅助方法        :param arr: 数组        :param low: 起始位置        :param high: 结束位置        """        if low < high:            pi = self._partition(arr, low, high)            self._quick_sort(arr, low, pi - 1)            self._quick_sort(arr, pi + 1, high)    def _partition(self, arr, low, high):        """        分区方法        :param arr: 数组        :param low: 起始位置        :param high: 结束位置        """        pivot = arr[high]        i = low - 1        for j in range(low, high):            if arr[j] <= pivot:                i += 1                arr[i], arr[j] = arr[j], arr[i]        arr[i + 1], arr[high] = arr[high], arr[i + 1]        return i + 1class MergeSort(SortStrategy):    """    归并排序策略    """    def sort(self, data):        """        归并排序实现        :param data: 待排序的数据        :return: 排序后的数据        """        print("使用归并排序...")        arr = data.copy()        self._merge_sort(arr)        return arr    def _merge_sort(self, arr):        """        归并排序辅助方法        :param arr: 数组        """        if len(arr) > 1:            mid = len(arr) // 2            left_half = arr[:mid]            right_half = arr[mid:]            self._merge_sort(left_half)            self._merge_sort(right_half)            i = j = k = 0            while i < len(left_half) and j < len(right_half):                if left_half[i] < right_half[j]:                    arr[k] = left_half[i]                    i += 1                else:                    arr[k] = right_half[j]                    j += 1                k += 1            while i < len(left_half):                arr[k] = left_half[i]                i += 1                k += 1            while j < len(right_half):                arr[k] = right_half[j]                j += 1                k += 1class DataProcessor:    """    数据处理器 - 上下文类    """    def __init__(self, sort_strategy: SortStrategy = None):        """        初始化数据处理器        :param sort_strategy: 排序策略        """        self.sort_strategy = sort_strategy or QuickSort()  # 默认使用快速排序    def set_sort_strategy(self, strategy: SortStrategy):        """        设置排序策略        :param strategy: 排序策略        """        self.sort_strategy = strategy    def process_data(self, data):        """        处理数据        :param data: 原始数据        :return: 处理后的数据        """        print(f"处理数据: {data}")        sorted_data = self.sort_strategy.sort(data)        print(f"排序结果: {sorted_data}")        return sorted_data# 使用排序策略模式print("\n=== 排序算法策略模式示例 ===")processor = DataProcessor()# 测试数据test_data = [64342512221190]print(f"原始数据: {test_data}")# 使用快速排序result1 = processor.process_data(test_data)# 切换为冒泡排序processor.set_sort_strategy(BubbleSort())result2 = processor.process_data(test_data)# 切换为归并排序processor.set_sort_strategy(MergeSort())result3 = processor.process_data(test_data)

=== 排序算法策略模式示例 ===原始数据: [64, 34, 25, 12, 22, 11, 90]处理数据: [64, 34, 25, 12, 22, 11, 90]使用快速排序...排序结果: [11, 12, 22, 25, 34, 64, 90]处理数据: [64, 34, 25, 12, 22, 11, 90]使用冒泡排序...排序结果: [11, 12, 22, 25, 34, 64, 90]处理数据: [64, 34, 25, 12, 22, 11, 90]使用归并排序...排序结果: [11, 12, 22, 25, 34, 64, 90]

策略模式在折扣系统中的应用

class DiscountStrategy(ABC):    """    折扣策略抽象类    """    @abstractmethod    def apply_discount(self, total_amount):        """        应用折扣        :param total_amount: 原始金额        :return: 折扣后的金额        """        passclass NoDiscount(DiscountStrategy):    """    无折扣策略    """    def apply_discount(self, total_amount):        """        不应用折扣        :param total_amount: 原始金额        :return: 折扣后的金额        """        print("无折扣")        return total_amountclass PercentageDiscount(DiscountStrategy):    """    百分比折扣策略    """    def __init__(self, percentage):        """        初始化百分比折扣        :param percentage: 折扣百分比 (如 10 表示 10% 折扣)        """        self.percentage = percentage    def apply_discount(self, total_amount):        """        应用百分比折扣        :param total_amount: 原始金额        :return: 折扣后的金额        """        discount_amount = total_amount * (self.percentage / 100)        discounted_amount = total_amount - discount_amount        print(f"应用 {self.percentage}% 折扣,折扣金额: ¥{discount_amount:.2f}")        return discounted_amountclass FixedAmountDiscount(DiscountStrategy):    """    固定金额折扣策略    """    def __init__(self, discount_amount):        """        初始化固定金额折扣        :param discount_amount: 折扣金额        """        self.discount_amount = discount_amount    def apply_discount(self, total_amount):        """        应用固定金额折扣        :param total_amount: 原始金额        :return: 折扣后的金额        """        discounted_amount = max(0, total_amount - self.discount_amount)        print(f"应用 ¥{self.discount_amount:.2f} 固定折扣")        return discounted_amountclass OrderCalculator:    """    订单计算器 - 上下文类    """    def __init__(self, discount_strategy: DiscountStrategy = None):        """        初始化订单计算器        :param discount_strategy: 折扣策略        """        self.discount_strategy = discount_strategy or NoDiscount()    def set_discount_strategy(self, strategy: DiscountStrategy):        """        设置折扣策略        :param strategy: 折扣策略        """        self.discount_strategy = strategy    def calculate_total(self, base_amount, tax_rate=0.1):        """        计算订单总额        :param base_amount: 基础金额        :param tax_rate: 税率        :return: 最终金额        """        # 应用折扣        discounted_amount = self.discount_strategy.apply_discount(base_amount)        # 计算税费        tax_amount = discounted_amount * tax_rate        # 计算总额        total_amount = discounted_amount + tax_amount        print(f"基础金额: ¥{base_amount:.2f}")        print(f"折扣后金额: ¥{discounted_amount:.2f}")        print(f"税费: ¥{tax_amount:.2f}")        print(f"总计: ¥{total_amount:.2f}")        return total_amount# 使用折扣策略模式print("\n=== 折扣系统策略模式示例 ===")calculator = OrderCalculator()# 测试金额original_amount = 100.00print(f"原始订单金额: ¥{original_amount:.2f}")# 无折扣print("\n--- 无折扣 ---")total1 = calculator.calculate_total(original_amount)# 10% 折扣print("\n--- 10% 百分比折扣 ---")calculator.set_discount_strategy(PercentageDiscount(10))total2 = calculator.calculate_total(original_amount)# 15元固定折扣print("\n--- 15元固定折扣 ---")calculator.set_discount_strategy(FixedAmountDiscount(15))total3 = calculator.calculate_total(original_amount)

=== 折扣系统策略模式示例 ===原始订单金额: ¥100.00--- 无折扣 ---无折扣基础金额: ¥100.00折扣后金额: ¥100.00税费: ¥10.00总计: ¥110.00--- 10% 百分比折扣 ---应用 10% 折扣,折扣金额: ¥10.00基础金额: ¥100.00折扣后金额: ¥90.00税费: ¥9.00总计: ¥99.00--- 15元固定折扣 ---应用 ¥15.00 固定折扣基础金额: ¥100.00折扣后金额: ¥85.00税费: ¥8.50总计: ¥93.50

高级策略模式:策略工厂

class PaymentStrategyFactory:    """    支付策略工厂    """    @staticmethod    def create_strategy(strategy_type, **kwargs):        """        根据类型创建支付策略        :param strategy_type: 策略类型        :param kwargs: 策略参数        :return: 支付策略实例        """        strategies = {            'credit_card': CreditCardPayment,            'alipay': AlipayPayment,            'wechat': WeChatPayment        }        if strategy_type in strategies:            strategy_class = strategies[strategy_type]            try:                return strategy_class(**kwargs)            except TypeError as e:                raise ValueError(f"创建{strategy_type}策略时参数错误: {e}")        else:            raise ValueError(f"不支持的支付策略: {strategy_type}")class DiscountStrategyFactory:    """    折扣策略工厂    """    @staticmethod    def create_strategy(strategy_type, **kwargs):        """        根据类型创建折扣策略        :param strategy_type: 策略类型        :param kwargs: 策略参数        :return: 折扣策略实例        """        strategies = {            'no_discount': NoDiscount,            'percentage': PercentageDiscount,            'fixed_amount': FixedAmountDiscount        }        if strategy_type in strategies:            strategy_class = strategies[strategy_type]            try:                if strategy_type == 'no_discount':                    return strategy_class()                elif strategy_type == 'percentage':                    return strategy_class(percentage=kwargs['percentage'])                elif strategy_type == 'fixed_amount':                    return strategy_class(discount_amount=kwargs['discount_amount'])            except KeyError as e:                raise ValueError(f"创建{strategy_type}策略时缺少必要参数: {e}")        else:            raise ValueError(f"不支持的折扣策略: {strategy_type}")# 使用策略工厂print("\n=== 策略工厂示例 ===")# 创建支付策略print("使用支付策略工厂:")credit_card_kwargs = {    'card_number''9876543210987654',    'cvv''456',    'expiry_date''11/26'}alipay_kwargs = {    'account''user@example.com'}credit_strategy = PaymentStrategyFactory.create_strategy('credit_card', **credit_card_kwargs)alipay_strategy = PaymentStrategyFactory.create_strategy('alipay', **alipay_kwargs)# 测试策略order_calculator = OrderCalculator()order_calculator.set_discount_strategy(    DiscountStrategyFactory.create_strategy('percentage', percentage=15))print(f"使用策略工厂计算订单: ¥{order_calculator.calculate_total(200.00):.2f}")# 使用上下文管理器模式print("\n=== 策略上下文管理器示例 ===")class StrategyContext:    """    策略上下文管理器    """    def __init__(self, context, strategy):        """        初始化策略上下文        :param context: 上下文对象        :param strategy: 策略对象        """        self.context = context        self.original_strategy = context.discount_strategy        self.temp_strategy = strategy    def __enter__(self):        """        进入上下文时应用临时策略        """        self.context.discount_strategy = self.temp_strategy        return self.context    def __exit__(self, exc_type, exc_value, traceback):        """        离开上下文时恢复原始策略        """        self.context.discount_strategy = self.original_strategy# 使用上下文管理器calculator = OrderCalculator()print(f"原始策略下计算: ¥{calculator.calculate_total(100.00):.2f}")with StrategyContext(calculator, PercentageDiscount(20)) as calc:    print(f"临时20%折扣下计算: ¥{calc.calculate_total(100.00):.2f}")print(f"恢复原始策略后计算: ¥{calculator.calculate_total(100.00):.2f}")

=== 策略工厂示例 ===使用支付策略工厂:应用 15% 折扣,折扣金额: ¥30.00基础金额: ¥200.00折扣后金额: ¥170.00税费: ¥17.00总计: ¥187.00使用策略工厂计算订单: ¥187.00=== 策略上下文管理器示例 ===无折扣基础金额: ¥100.00折扣后金额: ¥100.00税费: ¥10.00总计: ¥110.00原始策略下计算: ¥110.00应用 20% 折扣,折扣金额: ¥20.00基础金额: ¥100.00折扣后金额: ¥80.00税费: ¥8.00总计: ¥88.00临时20%折扣下计算: ¥88.00无折扣基础金额: ¥100.00折扣后金额: ¥100.00税费: ¥10.00总计: ¥110.00恢复原始策略后计算: ¥110.00

策略模式与函数式编程

from typing import CallableListimport functools# 使用函数作为策略def bubble_sort_func(data: List[int]) -> List[int]:    """冒泡排序函数"""    print("使用函数式冒泡排序...")    arr = data.copy()    n = len(arr)    for i in range(n):        for j in range(0, n - i - 1):            if arr[j] > arr[j + 1]:                arr[j], arr[j + 1] = arr[j + 1], arr[j]    return arrdef quick_sort_func(data: List[int]) -> List[int]:    """快速排序函数"""    print("使用函数式快速排序...")    if len(data) <= 1:        return data    pivot = data[len(data) // 2]    left = [x for x in data if x < pivot]    middle = [x for x in data if x == pivot]    right = [x for x in data if x > pivot]    return quick_sort_func(left) + middle + quick_sort_func(right)def merge_sort_func(data: List[int]) -> List[int]:    """归并排序函数"""    print("使用函数式归并排序...")    if len(data) <= 1:        return data    mid = len(data) // 2    left = merge_sort_func(data[:mid])    right = merge_sort_func(data[mid:])    return merge_func(left, right)def merge_func(left: List[int], right: List[int]) -> List[int]:    """合并函数"""    result = []    i = j = 0    while i < len(left) and j < len(right):        if left[i] <= right[j]:            result.append(left[i])            i += 1        else:            result.append(right[j])            j += 1    result.extend(left[i:])    result.extend(right[j:])    return resultclass FunctionalSorter:    """    函数式排序器    """    def __init__(self, sort_func: Callable[[List[int]], List[int]] = None):        """        初始化排序器        :param sort_func: 排序函数        """        self.sort_func = sort_func or quick_sort_func    def set_sort_func(self, sort_func: Callable[[List[int]], List[int]]):        """        设置排序函数        :param sort_func: 排序函数        """        self.sort_func = sort_func    def sort(self, data: List[int]) -> List[int]:        """        执行排序        :param data: 待排序数据        :return: 排序后数据        """        print(f"原始数据: {data}")        sorted_data = self.sort_func(data)        print(f"排序结果: {sorted_data}")        return sorted_data# 使用函数式策略模式print("\n=== 函数式策略模式示例 ===")functional_sorter = FunctionalSorter()test_data = [3472332562]print(f"测试数据: {test_data}")# 使用不同的函数式策略result1 = functional_sorter.sort(test_data)functional_sorter.set_sort_func(bubble_sort_func)result2 = functional_sorter.sort(test_data)functional_sorter.set_sort_func(merge_sort_func)result3 = functional_sorter.sort(test_data)

=== 函数式策略模式示例 ===测试数据: [34, 7, 23, 32, 5, 62]原始数据: [34, 7, 23, 32, 5, 62]使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...排序结果: [5, 7, 23, 32, 34, 62]原始数据: [34, 7, 23, 32, 5, 62]使用函数式冒泡排序...排序结果: [5, 7, 23, 32, 34, 62]原始数据: [34, 7, 23, 32, 5, 62]使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...使用函数式归并排序...排序结果: [5, 7, 23, 32, 34, 62]

策略模式的优缺点

优点:

1.算法可自由切换:客户端可以根据需要选择不同的算法

2.避免使用多重条件判断:不用大量的 if-else 或 switch-case 语句

3.扩展性良好:可以很方便地增加新的算法

4.符合开闭原则:对扩展开放,对修改关闭

缺点:

1.策略类数量增多:每个算法需要一个策略类

2.客户端必须了解策略:客户端需要知道有哪些策略可供选择

3.增加对象数量:每个策略都是一个对象

实际应用场景

策略模式在实际开发中的典型应用场景:

1.支付系统:不同支付方式的处理

2.排序算法:根据数据规模选择合适的排序算法

3.验证规则:不同的数据验证规则

4.缓存策略:不同的缓存淘汰算法(LRU、FIFO等)

5.压缩算法:不同的文件压缩算法

6.路径查找算法:不同的寻路算法

7.促销策略:不同的营销活动策略

策略模式最佳实践

from enum import Enumfrom typing import DictTypeclass StrategyType(Enum):    """策略类型枚举"""    CREDIT_CARD = "credit_card"    ALIPAY = "alipay"    WECHAT = "wechat"    NO_DISCOUNT = "no_discount"    PERCENTAGE_DISCOUNT = "percentage"class PaymentStrategyManager:    """    支付策略管理器 - 最佳实践    """    _strategies: Dict[StrategyType, Type[PaymentStrategy]] = {        StrategyType.CREDIT_CARD: CreditCardPayment,        StrategyType.ALIPAY: AlipayPayment,        StrategyType.WECHAT: WeChatPayment,    }    @classmethod    def register_strategy(cls, strategy_type: StrategyType, strategy_class: Type[PaymentStrategy]):        """        注册策略        :param strategy_type: 策略类型        :param strategy_class: 策略类        """        cls._strategies[strategy_type] = strategy_class    @classmethod    def create_strategy(cls, strategy_type: StrategyType, **kwargs) -> PaymentStrategy:        """        创建策略        :param strategy_type: 策略类型        :param kwargs: 策略参数        :return: 策略实例        """        if strategy_type not in cls._strategies:            raise ValueError(f"不支持的策略类型: {strategy_type}")        strategy_class = cls._strategies[strategy_type]        try:            return strategy_class(**kwargs)        except TypeError as e:            raise ValueError(f"创建{strategy_type}策略时参数错误: {e}")# 使用最佳实践的策略模式print("\n=== 策略模式最佳实践 ===")# 创建购物车cart = ShoppingCart()cart.add_item("手机"3999.00)# 使用策略管理器credit_strategy = PaymentStrategyManager.create_strategy(    StrategyType.CREDIT_CARD,    card_number="1111222233334444",    cvv="789",    expiry_date="10/27")alipay_strategy = PaymentStrategyManager.create_strategy(    StrategyType.ALIPAY,    account="customer@example.com")cart.set_payment_strategy(credit_strategy)result1 = cart.checkout()cart.set_payment_strategy(alipay_strategy)result2 = cart.checkout()print(f"订单1结果: {result1}")print(f"订单2结果: {result2}")

=== 策略模式最佳实践 ===添加商品: 手机, 价格: ¥3999.00, 总价: ¥3999.00支付方式已设置为: CreditCardPayment开始结账,总金额: ¥3999.00使用信用卡支付 ¥3999.00卡号: ****-****-****-4444支付结果: success支付方式已设置为: AlipayPayment开始结账,总金额: ¥3999.00使用支付宝支付 ¥3999.00账户: customer@example.com支付结果: success订单1结果: {'status': 'success', 'method': 'Credit Card', 'amount': 3999.0}订单2结果: {'status': 'success', 'method': 'Alipay', 'amount': 3999.0}

Python风格的策略模式

from typing import Protocolclass Sortable(Protocol):    """    可似协议(仅用于类型提示)    """    def sort(self, data: List[int]) -> List[int]:        ...class FlexibleSorter:    """    灵活的排序器,支持多种策略方式    """    def __init__(self, strategy):        """        初始化排序器        :param strategy: 排序策略(可以是对象或函数)        """        self.strategy = strategy    def sort(self, data: List[int]) -> List[int]:        """        执行排序        :param data: 待排序数据        :return: 排序后数据        """        # 如果策略是函数,直接调用        if callable(self.strategy):            return self.strategy(data)        # 如果策略是对象,调用其sort方法        else:            return self.strategy.sort(data)# 使用不同类型的策略print("\n=== Python风格策略模式示例 ===")data = [64342512221190]# 使用函数策略func_sorter = FlexibleSorter(quick_sort_func)result_func = func_sorter.sort(data)print(f"函数策略结果: {result_func}")# 使用对象策略obj_sorter = FlexibleSorter(MergeSort())result_obj = obj_sorter.sort(data)print(f"对象策略结果: {result_obj}")# 使用lambda策略lambda_sorter = FlexibleSorter(lambda x: sorted(x))result_lambda = lambda_sorter.sort(data)print(f"Lambda策略结果: {result_lambda}")

=== Python风格策略模式示例 ===使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...使用函数式快速排序...函数策略结果: [11, 12, 22, 25, 34, 64, 90]使用归并排序...对象策略结果: [11, 12, 22, 25, 34, 64, 90]Lambda策略结果: [11, 12, 22, 25, 34, 64, 90]

总结

策略模式是一种行为型设计模式,它将算法封装起来,并使它们可以相互替换。通过策略模式,我们可以创建灵活、可扩展的系统,避免了大量条件判断语句。在Python中,结合函数式编程、协议类型等特性,我们可以实现更加灵活多样的策略模式。

策略模式特别适用于需要根据不同情况选择不同算法的场景,它使算法可以独立于使用它的客户端而变化,提高了代码的可维护性和可扩展性。

---

本篇内容基于《精通Python设计模式(第2版)》中的策略模式相关内容,结合实际开发场景进行了提炼和扩展。敬请期待下一期的状态模式精读!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 04:35:57 HTTP/2.0 GET : https://f.mffb.com.cn/a/466702.html
  2. 运行时间 : 0.248081s [ 吞吐率:4.03req/s ] 内存消耗:4,803.72kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=66701552dcbd094ab800dcc2d5388cf4
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000598s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000610s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000444s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.003349s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000706s ]
  6. SELECT * FROM `set` [ RunTime:0.007324s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000571s ]
  8. SELECT * FROM `article` WHERE `id` = 466702 LIMIT 1 [ RunTime:0.010232s ]
  9. UPDATE `article` SET `lasttime` = 1770496557 WHERE `id` = 466702 [ RunTime:0.015568s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000313s ]
  11. SELECT * FROM `article` WHERE `id` < 466702 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002849s ]
  12. SELECT * FROM `article` WHERE `id` > 466702 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000593s ]
  13. SELECT * FROM `article` WHERE `id` < 466702 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.028676s ]
  14. SELECT * FROM `article` WHERE `id` < 466702 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.025767s ]
  15. SELECT * FROM `article` WHERE `id` < 466702 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.081276s ]
0.249702s