详解Python设计模式之策略模式

详解Python设计模式之策略模式

策略模式是什么

策略模式(Strategy Pattern)是一种行为模式,用于以相同的方式处理多个不同的行为。在策略模式中,算法被封装在独立的策略中,这使得它们易于替换、理解和扩展。此模式通过定义算法族、分别封装它们,使它们之间可以互换,此模式让算法的变化独立于使用算法的客户。

以计算器为例,有加法、减法、乘法、除法等操作。我们可以使用策略模式将每个操作的具体实现封装在各自的策略中,然后在计算器中使用相应的策略,这样就能够实现相同的接口对多个操作进行处理。

实现策略模式的步骤

1. 定义策略接口

首先,我们需要定义一个策略接口,该接口里面包含具体操作的抽象方法。

from abc import ABC, abstractmethod

class Strategy(ABC):
    @abstractmethod
    def operate(self, num1, num2):
        pass

2. 实现策略类

接下来,我们需要实现具体的策略类,该类需要继承策略接口,并实现对应的操作方法。

class Add(Strategy):
    def operate(self, num1, num2):
        return num1 + num2

class Subtract(Strategy):
    def operate(self, num1, num2):
        return num1 - num2

class Multiply(Strategy):
    def operate(self, num1, num2):
        return num1 * num2

class Divide(Strategy):
    def operate(self, num1, num2):
        return num1 / num2 if num2 != 0 else "Cannot divide by zero"

3. 实现上下文类

接下来,我们需要实现上下文类,该类负责使用相应的策略处理数据。

class Calculator:
    def __init__(self, strategy):
        self.strategy = strategy

    def execute(self, num1, num2):
        return self.strategy.operate(num1, num2)

4. 使用策略模式

最后,我们需要在客户端代码中使用策略模式。

if __name__ == '__main__':
    num1 = 10
    num2 = 5

    add = Add()
    calculator = Calculator(add)
    print(calculator.execute(num1, num2))

    subtract = Subtract()
    calculator = Calculator(subtract)
    print(calculator.execute(num1, num2))

    multiply = Multiply()
    calculator = Calculator(multiply)
    print(calculator.execute(num1, num2))

    divide = Divide()
    calculator = Calculator(divide)
    print(calculator.execute(num1, num2))

通过上述代码,我们可以将加法、减法、乘法、除法操作的具体实现封装在各自的策略类中,然后在上下文类 Calculator 中使用相应的策略处理数据。

示例说明

以下代码为将不同的排序算法封装在各自的策略类中,然后在上下文类中使用相应的策略进行排序。

定义策略接口

from abc import ABC, abstractmethod

class Strategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass

实现策略类

class BubbleSort(Strategy):
    def sort(self, data):
        n = len(data)

        for i in range(n):
            for j in range(n - i - 1):
                if data[j] > data[j + 1]:
                    data[j], data[j + 1] = data[j + 1], data[j]

        return data

class SelectionSort(Strategy):
    def sort(self, data):
        n = len(data)

        for i in range(n):
            min_index = i
            for j in range(i + 1, n):
                if data[j] < data[min_index]:
                    min_index = j

            data[i], data[min_index] = data[min_index], data[i]

        return data

实现上下文类

class SortingClient:
    def __init__(self, strategy):
        self.strategy = strategy

    def execute(self, data):
        return self.strategy.sort(data)

使用策略模式

if __name__ == '__main__':
    data = [5, 3, 8, 4, 2, 1]

    bubble_sort = BubbleSort()
    sorting_client = SortingClient(bubble_sort)
    print(sorting_client.execute(data))

    selection_sort = SelectionSort()
    sorting_client = SortingClient(selection_sort)
    print(sorting_client.execute(data))

通过上述代码,我们可以将冒泡排序和选择排序的具体实现封装在各自的策略类中,然后在上下文类 SortingClient 中使用相应的策略进行排序。

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

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

相关文章

  • Python3.9 beta2版本发布了,看看这7个新的PEP都是什么

    Python 3.9beta2版本发布了 Python 3.9 beta2 版本已经发布了,它包含了很多新的特性和改进,其中有7个新的 PEP (Python Enhancement Proposal)。 什么是PEP PEP 是 Python Enhancement Proposal(Python增强提案)的缩写,是 Python 社区用于描述新功能、规范…

    python 2023年5月14日
    00
  • ChatGPT 帮我自动编写 Python 爬虫脚本的详细过程

    下面是详细讲解“ChatGPT 帮我自动编写 Python 爬虫脚本的详细过程”的完整攻略。 1. 背景介绍 聊天机器人是利用机器学习和自然语言处理技术搭建的人工智能应用程序,可用于模拟人类对话。ChatGPT是一个基于自然语言处理技术的聊天机器人,能够生成各种类型的对话内容。 Python爬虫是指使用Python编写的网络数据采集工具,通过爬虫程序可以获取…

    python 2023年5月19日
    00
  • Python之parser.add_argument解读

    Python中的argparse模块是用于解析命令行参数和选项的标准模块。add_argument方法是argparse.ArgumentParser类中的一个方法,用于向该类中添加命令行选项和参数。 1. add_argument方法的基本用法 add_argument方法的基本用法如下: parser.add_argument(‘name’, actio…

    python 2023年6月3日
    00
  • Python接口自动化测试的实现

    Python接口自动化测试是一种常见的自动化测试方法,可以帮助我们更好地测试接口的功能和稳定性。本文将介绍Python接口自动化测试的实现,并提供两个示例。 1. 使用requests库实现接口自动化测试 我们使用requests库实现接口自动化测试。以下是一个示例,演示如何使用requests库实现接口自动化测试: import requests def …

    python 2023年5月15日
    00
  • python常用函数random()函数详解

    Python常用函数random()函数详解 在Python中,random()是一个常用的函数,用于随机生成一个0至1之间的实数。它可以为我们提供一个随机数,来进行各种实现上的应用。下面将详细讲解python常用函数random()函数的使用方法。 导入random模块 在使用random()函数之前,我们需要首先导入与之相关的random模块。导入方法如…

    python 2023年6月3日
    00
  • Django中使用极验Geetest滑动验证码过程解析

    下面是“Django中使用极验Geetest滑动验证码过程解析”的完整攻略。 什么是极验Geetest滑动验证码 极验Geetest滑动验证码是一种可以保障网站安全性的验证机制。通过综合分析用户行为特征,实现对机器人和人机协作攻击的防御。 Django中使用极验Geetest滑动验证码的步骤 1. 获取验证码 使用极验Geetest需要先到极验官网注册账号,…

    python 2023年6月3日
    00
  • 基于python实现FTP文件上传与下载操作(ftp&sftp协议)

    基于Python实现FTP文件上传与下载操作(FTP&SFTP协议) FTP(文件传输协议)是一种用于向互联网上传送文件的标准协议,而SFTP(SSH文件传输协议)则是FTP的安全替代。在Python中,通过ftplib库,我们可以使用FTP协议上传和下载文件,通过paramiko库,我们可以使用SFTP协议进行同样的操作。 本文将详细介绍如何基于P…

    python 2023年6月5日
    00
  • python写入数据到csv或xlsx文件的3种方法

    下面将为您详细讲解Python如何写入数据到CSV或XLSX文件的三种方法。 一、CSV文件写入 1.1 方法一:使用csv库写入数据 import csv # 自定义数据 data = [ [‘Jack’, ’27’, ‘Male’], [‘Rose’, ’25’, ‘Female’], [‘Tom’, ’30’, ‘Male’] ] # 写入CSV文件 …

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