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

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 产生token及token验证的方法

    产生 Token 和 Token 进行验证是我们在使用 Python 进行 Web 开发时,通常需要处理的问题,下面我会为你详细讲解 Python 中产生 Token 和 Token 进行验证的方法。 什么是 Token? Token(令牌)是指在 Web 开发中,为了验证用户身份而使用的一种安全验证方式。在用户登录成功后,服务器端返回一个 Token,该 …

    python 2023年5月20日
    00
  • python列表[list]和元组(tuple)详情

    Python列表[list]和元组(tuple)详情 在Python中,列表(List)和元组(Tuple)都是有序的集合,可以存储任意类型的数据,包括数字、字符串、甚至是其他列表或元组。本文将详细讲解Python列表和元组的区别、创建、访问、添加、删除、排序等操作,并提供两个实例说明。 列表(List) 列表是一种可变的有序集合,可以通过索引访问、添加、删…

    python 2023年5月13日
    00
  • Python中八大图像特效算法的示例详解

    下面是关于“Python中八大图像特效算法的示例详解”的完整攻略。 1. 八大图像效法简介 图像特效算法是一种用于对图像进行处理的算法,可以使图像更加美观或者增强图像的表现力。在Python中,我们可以使用八大图像特效算法来对图像进行处理。这八大图像特效算法包括:灰度化二值化、反转、镜像、旋转、缩放、模糊和锐化。 2. Python实现八大图像特算法 2.1…

    python 2023年5月13日
    00
  • Python自动化办公之Word转PDF的实现

    下面我将为大家讲解“Python自动化办公之Word转PDF的实现”的完整攻略。 1. 安装Python-docx 在Python中,可以使用Python-docx库来操作Word文档。首先,我们需要在命令行中使用pip命令来安装Python-docx库。 pip install python-docx 2. 安装Microsoft Word 要将Word文…

    python 2023年6月5日
    00
  • 利用Python获取操作系统信息实例

    下面是“利用Python获取操作系统信息实例”的完整攻略: 1. 背景介绍 在管理计算机系统的过程中,获取操作系统信息是非常必要的。Python提供了一些标准库、第三方库,可以方便快捷地获取计算机的各种信息。本篇攻略将介绍如何使用Python获取操作系统的信息。 2. 操作系统信息获取方法 Python的 platform 模块提供了一些函数用于获取平台信息…

    python 2023年5月30日
    00
  • 详解Python3.6的py文件打包生成exe

    下面我就详细讲解“详解Python3.6的py文件打包生成exe”的完整攻略。 简介 在Python开发中,经常需要将程序包装成exe文件形式,从而实现批量处理、部署、传输等功能。Python3中,我们可以使用pyinstaller模块来实现将.py文件打包成.exe文件。 打包过程 安装pyinstaller模块 首先,我们需要安装pyinstaller模…

    python 2023年5月14日
    00
  • 利用OpenCV和Python实现查找图片差异

    利用 OpenCV 和 Python 实现查找图片差异 简介 在实际工作中,我们经常需要对图片进行对比分析,例如查找两张图片之间的差异。 OpenCV 是一个功能强大,易于使用的图像处理工具包,可以在 Python 环境下使用。本文将讲解如何利用 OpenCV 和 Python 实现查找图片差异的完整攻略。 环境准备 在开始之前,请确保您有以下工具和包: P…

    python 2023年5月18日
    00
  • Python爬虫新手入门之初学lxml库

    Python爬虫新手入门之初学lxml库 什么是lxml库? Lxml是一个Python库,它用于解析XML和HTML文档。它是Python中最好的HTML和XML解析器之一。 安装lxml库 在安装lxml库之前,首先需要确保已经安装了以下依赖项: libxml2 libxslt 在Linux系统中,可以使用以下命令安装这些依赖项: sudo apt-ge…

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