Python设计模式中的策略模式详解

yizhihongxing

Python设计模式中的策略模式详解

策略模式简介

策略模式(Strategy Pattern)属于对象行为型模式。定义一系列算法 (算法族),将每个算法封装起来,让它们可以相互替换,使得算法的变化不会影响到使用算法的用户。

策略模式主要包含三个角色:

  • Context(环境类):上下文类,它通过一个成员变量将策略类传入上下文类中。
  • Strategy(抽象策略类):策略的抽象类或者接口,其定义了所有具体策略类所需的接口。
  • ConcreteStrategy(具体策略类):具体的策略类,实现抽象策略类定义的接口,提供具体的算法实现。

策略模式的优点

  • 策略模式提供了针对一组算法或行为的可互换对象群,让执行算法的对象和其客户端能够相互独立。
  • 策略模式为客户端提供多种算法或行为选择,可以更易于扩展应用。
  • 策略模式提供了一个明确的界面,可以有效地将算法从其他部分隔离开来。

策略模式的示例应用

下面通过两个示例来演示策略模式的应用。

示例1:商场打折

假设商场在进行促销活动时,打折力度不同。那么我们就可以利用策略模式来实现不同打折策略。

from abc import ABC, abstractmethod

class DiscountStrategy(ABC):
    """打折策略抽象类"""
    @abstractmethod
    def discount(self, price):
        pass

class FullDiscount(DiscountStrategy):
    """全额打折"""
    def discount(self, price):
        return price

class HalfDiscount(DiscountStrategy):
    """半额打折"""
    def discount(self, price):
        return price * 0.5

class QuarterDiscount(DiscountStrategy):
    """四分之一打折"""
    def discount(self, price):
        return price * 0.25

class Context:
    """环境类"""
    def __init__(self, discount_strategy):
        self.discount_strategy = discount_strategy

    def set_discount_strategy(self, discount_strategy):
        self.discount_strategy = discount_strategy

    def apply_discount(self, price):
        return self.discount_strategy.discount(price)

上面的代码定义了一个抽象类 DiscountStrategy 和三个具体的策略类 FullDiscountHalfDiscountQuarterDiscount,分别实现全额打折、半额打折和四分之一打折的功能。Context 类则作为策略类的上下文类,实现 apply_discount 方法用于计算价格。

运行测试代码:

price = 100
context = Context(FullDiscount())
assert context.apply_discount(price) == price
context.set_discount_strategy(HalfDiscount())
assert context.apply_discount(price) == 50
context.set_discount_strategy(QuarterDiscount())
assert context.apply_discount(price) == 25

示例2:排序算法

另一个示例是排序算法。假设我们要对一个列表进行排序,而排序算法有多种,那么就可以使用策略模式来实现。

from abc import ABC, abstractmethod

class SortingStrategy(ABC):
    """排序策略抽象类"""
    @abstractmethod
    def sort(self, data):
        pass

class BubbleSort(SortingStrategy):
    """冒泡排序"""
    def sort(self, data):
        for i in range(len(data)):
            for j in range(len(data) - i - 1):
                if data[j] > data[j+1]:
                    data[j], data[j+1] = data[j+1], data[j]
        return data

class QuickSort(SortingStrategy):
    """快速排序"""
    def sort(self, data):
        if len(data) < 2:
            return data
        pivot = data[0]
        left = [x for x in data[1:] if x <= pivot]
        right = [x for x in data[1:] if x > pivot]
        return self.sort(left) + [pivot] + self.sort(right)

class Context:
    """环境类"""
    def __init__(self, sorting_strategy):
        self.sorting_strategy = sorting_strategy

    def set_sorting_strategy(self, sorting_strategy):
        self.sorting_strategy = sorting_strategy

    def sort(self, data):
        return self.sorting_strategy.sort(data)

上面的代码定义了一个抽象类 SortingStrategy 和两个具体的排序策略类 BubbleSortQuickSort,分别实现冒泡排序和快速排序的功能。Context 类则作为排序策略类的上下文类,实现 sort 方法用于对数据进行排序。

运行测试代码:

data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
context = Context(BubbleSort())
assert context.sort(data) == [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
context.set_sorting_strategy(QuickSort())
assert context.sort(data) == [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

总结

策略模式是一种非常有用的设计模式,通过它可以将算法和实现进行分离,降低了代码的耦合度,同时也让代码更加灵活和易于扩展。在实际开发中,如果一个问题可以有多种解决方案,那么就可以考虑使用策略模式来实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python设计模式中的策略模式详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python matplotlib包和gif包生成gif动画实战对比

    下面是关于“Python matplotlib包和gif包生成gif动画实战对比”的攻略: 前言 生成动图对于数据可视化来说是非常重要的。Python中提供了多种生成动图的方式,其中matplotlib与gif包都是非常常见的库。matplotlib提供了非常强大的绘图功能,而gif包则专注于生成gif动图。本文将对两者进行详细的对比分析,并提供两个示例用于…

    python 2023年6月3日
    00
  • Python除法之传统除法、Floor除法及真除法实例详解

    Python除法之传统除法、Floor除法及真除法实例详解 在Python中,除法操作有三种不同的方式:传统除法、Floor除法和真除法。这些操作的行为略有不同,因此在使用时需要注意。下面我们将详细讲解这三种不同的除法操作,并提供多个实例以帮助您更好地理解。 传统除法 传统除法操作在Python中使用单斜杠符号/表示。它将两个数字相除,返回一个浮点数,保留小…

    python 2023年6月3日
    00
  • 详解python使用turtle库来画一朵花

    详解python使用turtle库来画一朵花 介绍 Turtle是Python的标准库之一,它提供了一种以类似Logo语言的方式来操作海龟进行绘图的方式。通过这种方式可以帮助我们更加了解计算机的动画呈现。 步骤 1. 导入turtle库 我们可以通过以下方式导入turtle库 import turtle 2. 创建画布 首先,我们需要创建一个画布来绘制我们的…

    python 2023年5月19日
    00
  • Python中requests库的基本概念与具体使用方法

    以下是关于Python中requests库的基本概念与具体使用方法的攻略: Python中requests库的基本概念与具体使用方法 requests是一个流行的HTTP库,用于向Web服务器发送HTTP请求和接收响应。以下是Python中requests库的基本概念与具体使用方法的攻略: 安装requests库 在使用requests库之前,需要先安装它。…

    python 2023年5月14日
    00
  • python获取命令行输入参数列表的实例代码

    在Python中获取命令行参数列表的方法是使用sys模块中的argv属性。argv属性是一个列表,包含了命令行输入的所有参数(包括脚本本身),它从列表下标1开始,即argv[1:]。 以下是获取命令行输入参数列表的实例代码: import sys # 打印命令行输入的所有参数 print("命令行参数列表:", sys.argv) # 打…

    python 2023年6月3日
    00
  • Python 第三方日志框架loguru使用

    当下的 Python 日志系统很复杂,各种日志框架比比皆是。在这些框架中,Loguru 是一个功能强大且极易上手的日志框架,在使用方面非常简单。下面将介绍Loguru的优势、核心功能以及如何使用它。 Loguru 的优势 强大的配置能力 支持异常信息捕捉 附带统一格式的日志 具有极佳的性能,适用于高并发场景 安装 Loguru 终端 / 控制台:pip in…

    python 2023年5月31日
    00
  • 如何导入其他 Python 文件?

    【问题标题】:How can I import other Python files?如何导入其他 Python 文件? 【发布时间】:2023-04-03 17:09:01 【问题描述】: 如何在 Python 中导入其他文件? 如何准确导入特定的 Python 文件,例如 import file.py? 如何导入文件夹而不是特定文件? 我想在运行时根据用…

    Python开发 2023年4月8日
    00
  • Python+OpenCV实现基本的图像处理操作

    Python+OpenCV实现基本的图像处理操作攻略 简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux,Windows,Android和Mac OS操作系统上。它轻量级而且高效,非常适合对图像和视频进行处理。Python+OpenCV结合使用,可以实现许多基本的图像处理操作。 在这篇攻略中,我们将讲解Python+…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部